В данной статье мы подробно рассмотрим анатомию транзакций в сети Bitcoin, для большей наглядности на конкретном примере.

Транзакции Биткоина выстраиваются в цепочки друг за другом. Новая транзакция должна указать из каких созданных до этого транзакций берутся монеты. Код транзакции можно посмотреть, например, на сайте blockexplorer.com. При этом изучить можно любые транзакции, которые есть в сети, они все доступны любому желающему их изучить.

Рассмотрим, к примеру, такую ситуацию. Некому Mr X переслали 30 BTC. Из них 10 он переправил Mr Y. После чего кто-то переслал еще 5 BTC Mr X. Затем Mr X отправляет все свои 24,9 BTC на адрес Mr Z. Оба раза выплачивается комиссия 0.05BTC.

bitcoin транзакции

Как же в данной ситуации будут выглядеть транзакции этих платежей?

Для транзакции tr2 код будет выгдядеть примерно так:

{
"hash":"2de95ed5d8be1f44889d331994081b7acca87782969bb658e98fc155438c71ca",
"ver":1,
"vin_sz":1,
"vout_sz":2,
"lock_time":0,
"size":227,
"in":[
    {
       "prev_out":{
       "hash":"b50f0d162ac9d073a5ab0ad873efb900771eec28b21e6bd1310da3e052b151ba",
       "n":0
       },
      "scriptSig":"3046022100fff2f97e7b27eaa9dd0e97778e54fc22dec84fc3179387bd21de2698818a4f7e0221
0086aedbeef9c0d4bd1501318d65b396e3ed74f9a1b8a682eebc9947da9c1ec97801 037a8af42aa6a9c71ec0dcd28788938d25f1487599edfcaf4441aff174f5f0bcd7"
    }
],

"out":[
    {
       "value":"10.00000000",
       "scriptPubKey":"OP_DUP OP_HASH160 a73570db4e204130bee36f2df00221e8cc86f852 OP_EQUALVERIFY OP_CHECKSIG"
       },
       {
       "value":"19.95000000",
       "scriptPubKey":"OP_DUP OP_HASH160 605b9313df4557dfb41f65ad76b519ff3720e17d OP_EQUALVERIFY OP_CHECKSIG"
    }
]
}

Здесь:

Основной блок:

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. Ее код будет примерно таким:

{
"hash":"d585a7c300bbf40501e2f9d70dbb24127935b84170692d639b63a0bc31f8f9c9",
"ver":1,
"vin_sz":2,
"vout_sz":1,
"lock_time":0,
"size":490,
"in":[
    {
       "prev_out":{
       "hash":"2de95ed5d8be1f44889d331994081b7acca87782969bb658e98fc155438c71ca",
       "n":1
       },
      "scriptSig":"3046022100f4d15bb0a5292a3e2b66dae278a711b00865633cba328b8e8bc4384726b8019002210
0a46a9e3dba3585a34d5800b03c1a8f2271f873aeba33e9ae34c5e588f51be4b301 039152828874042c670f562ce92e7e0cce38a45f1fb5c7f5d167cd8c1c4c7f83fa"
    },
    {
       "prev_out":{
       "hash":"8b6a720b657b0a2dd71ffd8b79d9397c5ab409f5e0e2a8a3e06c2e94e79ff1cf",
       "n":0
       },
      "scriptSig":"3046022100e921e996e1732c09519d6ad63f44abb1b7572b2d75cf89bc7a46f8a9c645ed6e022100
da7b53d846e0e4077e8de51429481b5d39478db767fca04e60e29edddc5bda0601 0304279936210a2dd671cf15728ee77dfb29e7add85f7b27232eac89ad930d62a0"
    }
],

"out":[
    {
       "value":"24.90000000",
       "scriptPubKey":"OP_DUP OP_HASH160 a73570db4e204130bee36f2df00221e8cc86f852 OP_EQUALVERIFY OP_CHECKSIG"
       }
]
}

здесь vin_sz уже равно 2. vout_sz = 1, так как отправляются все деньги (минус комиссия).

Hash первого входа представляет собой хэш транзакции tr2. В этой транзакции мы получили назад в качестве сдачи 19.95 BTC и это был второй по счету выход для этой транзакции (см код tr2). А так как отсчет начинается с 0, то значение n в этом случае будет 1. Хэш второго входа - хэш транзакции tr3.