В getrawtransaction какое целое число vout в списке vin?

Я работаю над отслеживанием биткойн-транзакций, поступающих через getrawtransaction.

Мне не удалось найти необходимую документацию для описания целого числа vout в массиве vin:

{"txid"=>"0fbf9a6f2172251611a58028bf596c3ace98b19f6f08d2b6581326c58aecda8e",
    "vout"=>0,     <----- THIS
    "scriptSig"=>
     {"asm"=>
       "3045022100a9ba4f0b8ff86e91e622f43f9b76944643a807c0f6c8b43490087a169fe7542f0220258eaa36c96faaaeb41052e8d4aa41f74950df1b1c2835cb677f201c1ee0a33901 0393a2770ce81ddd9cd1e6ef71a282261ef8c03648373db209078f7850b9ab1ad1",
      "hex"=>
       "483045022100a9ba4f0b8ff86e91e622f43f9b76944643a807c0f6c8b43490087a169fe7542f0220258eaa36c96faaaeb41052e8d4aa41f74950df1b1c2835cb677f201c1ee0a33901210393a2770ce81ddd9cd1e6ef71a282261ef8c03648373db209078f7850b9ab1ad1"},
    "sequence"=>4294967295},
{"txid"=>"4983504e9727a5ea73c4a0915da475faba248d0d8da265e2d270563dc3eabbaf",
    "vout"=>1,     <----- THIS
    "scriptSig"=>
     {"asm"=>
       "3045022100ccc460cb0b8777d14f27acb821eacae0b5316de19db03ea707c59364f098d44f0220058a4f9df9a917944299b4c52efe500d50ab28c2fd29bb7b9ff8b75f38abcd4201 03244951ad9d146a635b321816d953e54986c62ce9c92502873335531dada0156c",
      "hex"=>
       "483045022100ccc460cb0b8777d14f27acb821eacae0b5316de19db03ea707c59364f098d44f0220058a4f9df9a917944299b4c52efe500d50ab28c2fd29bb7b9ff8b75f38abcd42012103244951ad9d146a635b321816d953e54986c62ce9c92502873335531dada0156c"},
    "sequence"=>4294967295}

В транзакциях, которые я вижу, он имеет тенденцию к vout 0 1 0 1 0 1 в массиве. Что это означает в транзакции? Нужно ли интерпретировать это особым образом? Спасибо!

Ответы (5)

Вход каждой транзакции относится к выходу предыдущей транзакции.

Вход не может быть определен только хешем транзакции. Транзакция состоит из 1 или более выходов, если вы укажете только хэш транзакции, нет возможности узнать, какой выход потрачен.**

Поскольку такие вопросы часто возникают из-за более серьезного непонимания того, как сеть «действительно работает», я собираюсь начать с некоторых «простых английских» правил для транзакций (tx):

1. A tx consists of one or more inputs and one or more outputs.
2. All tx inputs refer to an unspent output of a prior transaction.
3. The full value of an input is always spent; a tx can not spend part of the value.
4. Likewise all outputs are either spent or unspent, they can't be partially spent.
5. A tx "spends" the outputs which are referenced in the input portion of the tx.
6. A tx creates new spendable "unspent outputs" listed in the output portion of the tx.

Теперь, когда мы разобрались с этим, чтобы определить ввод tx, вам нужно обратиться к хэшу предыдущей транзакции И выходному индексу . Хэш tx идентифицирует транзакцию, но транзакция может иметь более одного вывода, поэтому индекс используется для определения того, какой вывод здесь «тратится».

Это может показаться запутанным, потому что вы услышите такие утверждения, как «У меня есть 20 BTC, хранящиеся по адресу 1XYZ…» или «В моем кошельке было 100 BTC», но на самом деле это абстракция. Клиент просто показывает вам сумму всех неизрасходованных выходов для адреса или всего кошелька.

Сеть Биткойн работает на концепции входов и выходов.

Сеть Биткойн не учитывает «значение» адреса при проверке txs. При проверке tx выходы рассматриваются как независимые объекты. Использование одного выхода для определенного адреса не влияет на другие выходы (если таковые имеются) для этого адреса. Транзакция действительна (среди прочего), если все входы относятся к действительным неизрасходованным выходам предыдущих транзакций (нельзя тратить монеты дважды), сумма выходов меньше или равна сумме входов (нельзя поддельные новые монеты), а входы подписаны правильным закрытым ключом (только «владелец» закрытого ключа может тратить монеты).

Примеры

Чтобы избежать излишней детализации, мы рассмотрим упрощенную версию транзакций, используемых в сети Биткойн.

Скажем, существует предыдущая транзакция (tx hash 1234567890). В этой транзакции у вас есть ввод, который ссылается на неизрасходованный вывод предыдущей транзакции на сумму 100 BTC. Вы отправляете 50 BTC на один адрес, 10 BTC на другой адрес, а сдача (40 BTC) отправляется на новый адрес в вашем кошельке. Помните, что мы не можем потратить часть неизрасходованного вывода, поэтому сдача необходима, потому что мы тратим 100 BTC на входе, а нам нужно только «отправить» 60 BTC.

Упрощенная псевдотранзакция может выглядеть примерно так.

In[0] <lets ignore the input for now but it does have a value of 100 BTC>
Out[0] Bitcoin address=1ABC... Value=50 BTC
Out[1] Bitcoin address=1DEF... Value=10 BTC
Out[2] Bitcoin address=1XYZ... Value=40 BTC

У tx есть 1 вход, 3 выхода, все индексы входа/выхода основаны на нуле, а значение выходов равно значению входа. Если выход (ы) меньше, чем вход (ы), то разница составляет комиссию, уплачиваемую майнеру. Если выходы больше, чем вход (ы), то tx недействителен.

Теперь, поскольку адрес «сдачи» 1XYZ — это еще один адрес в нашем кошельке, мы можем использовать его в новых транзакциях. Мы заплатим мерчанту 1 BTC и дадим майнеру комиссию 0,01 за быстрое включение в блок. Сдача будет отправлена ​​на еще один новый адрес в кошельке (1ZZZ....). В результате транзакция может выглядеть следующим образом:

In[0]  Tx hash=1234567890 OutputIndex=2
Out[0] Bitcoin Address=1HIJ... Value=1 BTC
Out[1] Bitcoin Address=1ZZZ... Value=38.99 BTC

Вход относится к 3-му (0 базовый массив) выходу tx выше. Глядя на выходной индекс 2 tx 123456789, мы видим значение 40,00 BTC. Сумма выходов составляет 39,99, что означает, что майнер блока соберет 0,01 BTC.

Реальные txs отличаются от упрощенной версии, показанной выше

Обратите внимание, что это не очень важно, если только вы не хотите глубже погрузиться в работу протокола. Вывод биткойн-транзакций на самом деле представляет собой скрипты, а не статические адреса и значения, показанные выше. Функционально для большинства выводов они работают одинаково, хотя для экономии места в выводе используется хэш открытого ключа, а не адрес. Все блоки имеют обязательную транзакцию, называемую coinbase, которая не имеет входных данных, поскольку выходом является субсидия на блок и сборы, выплачиваемые майнерам. Все значения в сети Биткойн являются целыми числами в сатоши (1E-8 BTC), поэтому технически все числа в этом посте должны быть умножены на 1E8.

У одной биткойн-транзакции может быть много выходов. Поле vout позволяет вам указать, какой вывод вы хотите потратить.

Посмотрите на эту сделку . Предположим, у вас есть ключ 1EZ5, но нет ключа 199N. Вам необходимо уточнить в сети Биткойн, какой вывод вы хотите потратить.

Я не уверен, что понимаю. Почему вы не хотите тратить вывод, включенный в транзакцию? Не могли бы вы привести пример для демонстрации? Спасибо!
Дело не в том, что вы не хотите тратить результат, а в том, что у вас нет ключа к нему.
Быстрое и точное объяснение для тех, кто уже знаком с основами протокола (в отличие от ответа @DeathAndTaxes). Спасибо!

Таким образом, vout относится к индексу рассматриваемого выходного адреса. Индекс начинается с 0. Так, например, если tx имеет 10 выходных адресов, vout для адресов будет от 0 до 9.

В vin list vout позволяет указать, какой вывод вы хотите потратить на кого. Каждый vout имеет свой собственный tx_id. и сумма значений этого vout равна общему количеству BTC, которое у нас есть для транзакции; И если

если vout < vin , то разница этих сумм выплачивается несовершеннолетнему.

иначе vout > vin , тогда tx_id недействителен.

Короче говоря, vout можно рассматривать как идентификатор вывода внутри предыдущей транзакции.

имейте в виду, что входные данные, которые вы хотите включить в свою транзакцию, являются выходными данными предыдущей транзакции, поэтому вы возвращаетесь к полученной транзакции и выбираете, какие выходные данные включить в качестве входных данных в вашу новую транзакцию. Однако, если вам все равно, биткойн-клиент сделает это вместо вас.