Введение в технологию Блокчейн
Шрифт:
Существует два основных способа кодирования адресов, которые могут быть переданы от получателя к отправителю: это передача текстовой строки или передача QR-кода.
Чтобы закодировать адрес в виде текстовой строки, мы берем биты ключа и преобразуем их из двоичного числа в число base 58.
Что означает base58?
«base» означает число символов, которые вы используете для представления числа.
В
Чем больше символов у вас в базе, тем меньше их вам нужно использовать для представления больших чисел. Таким образом, чем больше база, тем короче число.
Почему используется base58?
58 – это усеченное количество символов алфавитно-цифрового алфавита, где есть 62 символа.
В base58 удалены плохие символы, такие как 0, O, L и I, которые легко можно спутать.
Таким образом, base58 имеет два преимущества:
Эта база дает большой набор символов, чтобы представлять большие числа в более коротком формате.
И эта база не содержит неудобные символы, чтобы вы не ошибались при расшифровке.
Например, чтобы перевести десятичное число в 58-ричное, нужно все время делить на 58, брать остаток и сопоставлять его номеру символа базы.
Таким образом, чтобы закодировать адрес в виде текстовой строки, мы берем биты публичного ключа и преобразуем их из двоичного числа в число base 58.
Затем мы используем набор из 58 символов для представления каждой цифры в качестве символа.
Однако такого ручного метода передачи адресов с помощью строк можно избежать с помощью QR-кода.
Таким образом, второй способ кодирования адреса биткойнов – это QR-код, или двумерный штрих-код.
Преимущество QR-кода заключается в том, что вы можете сфотографировать его с помощью смартфона, а программное обеспечение для кошелька может автоматически конвертировать штрих-код в последовательность бит, которая представляет соответствующий биткойн-адрес.
Хранение биткойнов на вашем компьютере или другом устройстве – аналогично тому, как перекладывать деньги из кошелька или в кошелек.
Это называется «горячее хранением».
Это удобно, но также рискованно.
С другой стороны, есть «холодное хранение», которое не подключено к Интернету, и которое заархивировано.
Такое хранение более безопасно, но, конечно, не так удобно.
Чтобы иметь отдельное горячее и холодное хранилище, вам нужно иметь отдельные секретные ключи для каждого из них – иначе монеты в холодном хранилище будут уязвимы, если горячее хранилище будет взломано.
Также вам нужно перемещать монеты туда и обратно между этими двумя хранилищами, используя публичные ключи, которые соответствуют адресам этих хранилищ.
Холодное хранилище не подключено к сети, поэтому горячее хранилище и холодное хранилище не смогут подключаться друг к другу в любом месте.
Но хорошая новость заключается в том, что холодное хранилище не обязательно должно
быть онлайн для получения монет – потому что, так как горячее хранилище знает адрес холодного хранилища, оно может в любой момент отправить монеты в холодное хранилище.В любое время, когда количество денег в вашем горячем кошельке становится слишком большим, вы можете перенести их в холодное хранилище, не подвергая его риску подключением к сети.
В следующий раз, когда холодное хранилище подключится к сети, оно сможет обновить информацию о цепочке блоков, а затем холодное хранилище сможет делать все что хочет с этими монетами.
Но есть небольшая проблема, когда дело доходит до управления адресами холодного хранилища.
С одной стороны, для конфиденциальности и других причин мы хотим иметь возможность получать каждую сумму денег по отдельному адресу со своим секретным ключом.
Поэтому всякий раз, когда мы переносим сумму денег из горячего хранилища в холодное хранилище, мы хотели бы использовать для этой цели свежий холодный адрес.
Но так как холодное хранилище не в сети, мы должны иметь какой-то способ, чтобы горячее хранилище узнала об этих адресах.
Тупым решением было бы генерация большой партии адресов одновременно холодным хранилищем и отправка их горячему хранилищу, чтобы в дальнейшем использовать их по одному.
Недостатком является то, что мы должны периодически подключать холодное хранилище, чтобы передавать дополнительно адреса.
Однако более эффективным решением является использование иерархического кошелька.
Это позволяет холодному хранилищу использовать неограниченное количество адресов, и горячему хранилищу знать об этих адресах, с помощью короткой одноразовой связью между двумя хранилищами. Но это требует немного криптографического обмана.
Прежде всего, когда мы говорили о генерации ключей и цифровых подписях, мы рассмотрели функцию, называемую generateKeys, которая генерирует открытый ключ (который действует как адрес) и секретный ключ.
В иерархическом кошельке генерация ключей работает по-другому.
Вместо того, чтобы генерировать единственный адрес, мы генерируем то, что будем называть информацией о генерации адреса, а вместо приватного ключа генерируем то, что мы будем называть информацией о генерации секретного ключа.
Учитывая информацию о генерации адреса, мы можем генерировать последовательность адресов: мы применяем функцию генерации адреса, которая принимает в качестве входных данных информацию о генерации адресов и любое целое число n и генерирует n-й адрес в последовательности.
Аналогичным образом мы можем генерировать последовательность приватных ключей с использованием информации о генерации секретного ключа.
Криптографическая магия заключается в том, что для каждого i, адрес и секретный ключ соответствуют друг другу, то есть i-й секретный ключ может использоваться для траты биткойнов с i-го адреса так же, как если бы пара была сформирована прежним способом.
Таким образом, теперь у нас есть последовательность пар ключей.