В данной статье мы подробно рассмотрим анатомию транзакций в сети Bitcoin, для большей наглядности на конкретном примере.
Транзакции Биткоина выстраиваются в цепочки друг за другом. Новая транзакция должна указать из каких созданных до этого транзакций берутся монеты. Код транзакции можно посмотреть, например, на сайте blockexplorer.com. При этом изучить можно любые транзакции, которые есть в сети, они все доступны любому желающему их изучить.
Рассмотрим, к примеру, такую ситуацию. Некому Mr X переслали 30 BTC. Из них 10 он переправил Mr Y. После чего кто-то переслал еще 5 BTC Mr X. Затем Mr X отправляет все свои 24,9 BTC на адрес Mr Z. Оба раза выплачивается комиссия 0.05BTC.
Как же в данной ситуации будут выглядеть транзакции этих платежей?
Для транзакции tr2 код будет выгдядеть примерно так:
Здесь:
Основной блок:
hash - хэш всей транзакции. На этот хэш будут ссылаться следующие за этой транзакции.
ver - версия схемы транзакции. Пока что это всегда версия 1.
vin_sz - количество предыдущих транзакций, откуда брались монеты. В нашем случае это число равно 1, так как все монеты (10 BTC) берутся из тех 30 BTC, которые поступили в кошелек ранее, то есть из одной транзакции.
vout_sz - количество адресов, на которые переводятся монеты. В нашей ситуации 2. Так как при отправке BTC все деньги с адреса, с которого идет отправка, должны быть куда-то переправлены. То есть 10 монет идет новому получателю, 0.05 - комиссия и остальное (19.95) отправляется на только что сгенерированный клиентом новый адрес вашего кошелька (это не тот же адрес, с которого идет отправка), как сдача. При этом комиссия в транзакции не указывается, а высчитывается как разница между количеством монет, которые поступили с входящих транзакций и количеством монет, которые ушли через исходящие.
lock_time - требуется для создания отложенных транзакций. Пока не используется и равняется 0.
size - размер транзакции в формате JSON в байтах.
Блок in:
in - список входящих транзакций, число которых указывается в vin_sz.
hash - хэш предыдущей транзакции в блоке in. В нашем случае это будет хэш транзакции tr1.
n - указывает из какого выхода транзакции берутся монеты. Отсчет начинается с 0. В примере следующей транзакции будет подробнее расписано значение этого параметра.
scriptSig - В этой строке владелец монет подтверждает свое право ими распоряжаться. Сначала указывается открытый ключ владельца, затем подпись этой транзакции, сделанная его закрытым ключом.
Блок out:
out - список исходящих транзакций.
value - количество монет, которые передаются в описываемом выходе. В нашем случае 10 монет идет получателю, а 19.95 (после вычета комиссии) возвращается нам на новый адрес.
scriptPubKey - содержит хэш открытого ключа получателя монет.
Теперь рассмотрим транзакцию tr4. Так как отправляются все монеты, которые есть в кошельке, то у новой транзакции уже две входные транзакции: tr2 и tr3. Ее код будет примерно таким:
здесь vin_sz уже равно 2. vout_sz = 1, так как отправляются все деньги (минус комиссия).
Hash первого входа представляет собой хэш транзакции tr2. В этой транзакции мы получили назад в качестве сдачи 19.95 BTC и это был второй по счету выход для этой транзакции (см код tr2). А так как отсчет начинается с 0, то значение n в этом случае будет 1. Хэш второго входа - хэш транзакции tr3.
Подписывайтесь на новости и их анализ в нашем Telegram канале!