Адреса в системе Bitcoin
Bitcoin адрес является результатом преобразования открытого ключа пользователя. Публичные ключи, или адреса биткоин выполняют функцию конечных точек при отправке и приёме денежных средств. Соответствующие им приватные ключи авторизуют отправителя. Адреса не содержат никакой информации об их владельце и в общем случае являются анонимными. Каждый участник сети биткоин имеет так называемый кошелёк, содержащий произвольное количество пар ключей. Bitcoin использует алгоритм ECDSA с параметрами secp256k1 для создания новых пар ключей. Размер закрытого ключа — 256 бит, а соответствующего ему открытого ключа — 512 бит. Пользователь биткоин может иметь множество адресов, создавая их по собственной инициативе. Создание нового адреса представляет собой создание новой пары ключей и не требует даже соединения с сетью. Создание адреса лишь для одной транзакции или одного корреспондента помогает сохранить анонимность.
Алгоритм создания Bitcoin адреса
1. Открытый ключ последовательно хэшируется с помощью SHA-256 и RIPEMD-160.
2. Перед результатом пункта 1 добавляется байт ID сети (0x00 — основная сеть).
3. Применяется SHA-256 к результату пункта 2.
4. Выбираются первые 32 бита от результата предыдущего шага и добавляются в конец результата пункта 2.
5. Результат пункта 4 преобразуется в base58 строку при помощи Base58Check кодирования.
Адреса в текстовой форме представляют собой строки длиной до 34 символов, состоящие из букв латинского алфавита и цифр, например 13MBZ21g7KqpJWA9egnYwJuXef65ot5cT7. Существуют варианты представления адресов биткоин в виде QR-кодов и других двухмерных штрихкодов, пригодных для считывания мобильными устройствами.
Транзакции в сети Биткоин
Bitcoin определяет каждую монету цепочкой цифровых подписей. Когда один пользователь передает некую сумму другому пользователю, он создает новую транзакцию, которая содержит хэш предыдущей транзакции, подписанный им, и публичный ключ следующего владельца. Затем эта информация широковещательным запросом отправляется в сеть биткоин. Остальные участники сети проверяют подписи, прежде чем принять транзакцию к обработке.
Возможны случаи, когда необходимо передать средства, полученные из разных транзакций нескольким различным пользователям. Для этих целей транзакции поддерживают множественные входы и выходы. Значения со всех входов суммируются, и сумма распределяется по выходам.
Для того, чтобы проверить транзакцию, применяются сценарии на Forth-подобном языке. В настоящее время в Bitcoin существует три различных сценария транзакции: перевод на IP-адрес, перевод на Bitcoin-адрес и генерация. Последний тип транзакций используется при генерации блоков для эмиссии новых монет.
Цепочка блоков Биткоин
Основная последовательность блоков является самой длинной от начального до текущего. Побочные ветви отсекаются. Транзакции не подтверждаются, пока не будут коллективными усилиями сети упакованы в последовательность блоков. Подтверждение основывается на том, что проделанная работа по упаковке может быть быстро проверена, что исключает многократное расходование одних и тех же средств и подделку.
Блок представляет собой запись всех или некоторых из самых последних транзакций, которые ещё не были записаны в предыдущие блоки. Он делится на заголовок и список транзакций. Заголовок блока включает в себя свой SHA-256 хэш, версию блока(сейчас используется только данная версия блока — 1), SHA-256 хэш предыдущего блока из цепочки, список хэшей транзакций, время создания блока, параметры bits и nounce, количество транзакций в блоке и размер блока в байтах. В начало списка транзакций добавляется транзакция генерации, которая в случае успешной генерации блока передает пользователю награду за созданный блок.
Созданный блок будет принят остальными пользователями только в том случае, если SHA-256 хэш заголовка равен или ниже определенной цели, которая вычисляется из параметра bits. Например, если значение bits 0x1a0115cb, то целью является 0x0115cb * 2**(8*(0x1a — 3)) = 0x0000000000000115cb0000000000000000000000000000000000000000000000. Максимально возможная цель (то есть минимальная сложность) определяется значением bits 0x1d00ffff.
Если блок не удовлетворяет цели, то параметр nounce изменяется и хэш пересчитывается. Этот процесс требует множества циклов проб и ошибок, так как результат функции хэширования (SHA-256) практически непредсказуем. Когда задача решена, узел рассылает полученный блок всем подключенным узлам. Другие узлы проверяют блок, и, если он верен, принимают его в качестве следующего действительного, то есть добавляют в цепочку.
Цель корректируется каждые 2016 блоков, в зависимости от того, сколько времени понадобилось на их создание. В идеале вся сеть будет генерировать один блок каждые 10 минут, то есть на генерацию 2016 блоков должно уйти две недели. Если 2016 блоков было сгенерировано больше чем за две недели, то цель увеличивается, в противном случае уменьшается. Таким образом, система будет генерировать блоки с постоянной скоростью, не зависящей от мощности сети.
Таким образом цепочка блоков содержит криптографическую историю владения определённой порцией биткоин. Если пользователь попытается использовать некогда потраченные биткоины снова, сеть не примет его транзакцию как действительную.