Анатомия Bitcoin транзакций

NSerega

Администратор
В данной статье мы подробно рассмотрим анатомию транзакций в сети Bitcoin, для большей наглядности на конкретном примере.
Транзакция Bitcoin выстраиваются в цепочки друг за другом. Новая транзакция должна указать из каких созданных до этого транзакций берутся монеты. Код транзакции можно посмотреть, например, на сайте _http://blockexplorer.com/. При этом изучить можно любые транзакции, которые есть в сети, они все доступны любому желающему их изучить.
Рассмотрим, к примеру, такую ситуацию. Некому Mr X переслали 30 BTC. Из них 10 он переправил Mr Y. После чего кто-то переслал еще 5 BTC Mr X. Затем Mr X отправляет все свои 24,9 BTC на адрес Mr Z. Оба раза выплачивается комиссия 0.05BTC.

attachment.php

Как же в данной ситуации будут выглядеть транзакции этих платежей?
Для транзакции 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.
Источник
 

Вложения

  • bitcoin_transaction.png
    bitcoin_transaction.png
    23,6 КБ · Просмотры: 34
Верх