Raw транзакции – это способ создания транзакций и управления Bitcoin кошельком через командную строку, где полностью вручную можно указать все возможные параметры и обойти ограничения, вносимые графическими оболочками клиентов.


Консоль можно открыть через bitcoin-Qt. Меню: Help -> Debug Window -> вкладка “Concole”. Либо, если используется демон bitcoind, то можно выполнять команды напрямую через терминал операционной системы, например в Windows:

"C:\Program Files\Bitcoin\daemon\bitcoind.exe" help

Какие существуют команды?

    Все возможные команды, которые можно использовать в консоли, можно посмотреть командой help. Их действительно очень много. В данной статье будут рассмотрены команды, которые требуются для создания raw транзакций.

  • listunspent [minconf] [maxconf] ["address",...] - выводит данные о монетах, содержащихся в кошельке.
  • minconf и maxconf – необязательные параметры, заставляющие показывать только те монеты, которые имеют количество подтверждений в промежутке между этими значениями включительно. Тем самым можно сократить список вывода, так как иногда он может быть очень длинным, если кошелек активно используется.

    Пример команды, выводящей список монет на указанном адресе с числом подтверждений от 10 и больше:

    listunspent 10 "1HZzTrB58hEym28oBJ5QzpKQDKnH2RVoSA"
    listunspent

    Вывод состоит из 5 элементов:

    1. txid –ID транзакции;
    2. vout – номер выхода транзакции;
    3. scriptPubKey – хэш открытого ключа получателя (Ваш).
    4. amount – количество монет
    5. confirmations – число подтверждений транзакции.

    Более подробно о все элементах, из которых состоит транзакция, можно прочитать в статье Анатомия Bitcoin транзакций, а также статье Транзакции Bitcoin.

  • createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...} - создание транзакции на отправку монет на указанный адрес (или несколько адресов).
  • txid – id транзакции, которая будет на входе создаваемой

    vout – какой выход этой транзакции мы используем.

    amount – сколько BTC отправляем.

    Следует быть внимательным и не забыть включить в транзакцию комиссию, а то она может быть никогда не включена в блок.

    Пример команды:

    createrawtransaction '[{"txid":"d585a7c300bbf40501e2f9d70dbb24127935b84170692d639b63a0bc31f8f9c9","vout":0}]' '{"1DTiTxzDWMm54R7bM1eTNbCu5e77CGjyN9":0.003,"1uTzp2ewz8Q9qn1BenCyiFZouDodRTzY3":0.005}'

    В данной транзакции 0,003 монеты отправится новому получателю, для 0,005 указываем наш адрес, чтобы они остались при нас. И 0,0005 BTC – оставшиеся монеты - на комиссию.

    Ответ возвращает хэш транзакции:

    0100000001c9f9f831bca0639b632d697041b835791224bb0dd7f9e20105f4bb00c3a785d50000000000fffffff
    f02e0930400000000001976a91488aef0056e4db4eb3a8e0b0d4d9fcd62ca23c35b88ac20a1070000000000
    1976a91409ec2a6ef3d99c40e91a8b150c7fa31053fbe9af88ac00000000

    Или, если отправляемые монеты будут браться из нескольких транзакций, то тогда написание команды усложнится, и для двух входящих будет выглядеть примерно так:

    Createrawtransaction '[{"txid":"XXXXXXX","vout":X},{"txid":"YYYYYY","vout":Y}]' '{"AAAAA":A,"BBBBBB":B}'

    По аналогии можно написать команду для сколь угодно длинной транзакции.

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

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

  • decoderawtransaction <hex string> - возвращает подробные данные о транзакции. Таким образом можно дополнительно проверить, что транзакция сформирована правильно. В качестве hex string вставляем полученный нами ранее хэш транзакции.
  • decoderawtransaction

    Если кошелек заблокирован паролем, нужно сначала его ввести перед последующим подписанием транзакции, использовав команду:

  • walletpassphrase your_pass timeout

  • timeout – указывается число секунд, сколько авторизация с этим паролем будет действовать. После истечения этого времени, потребуется заново выполнять команду walletpassphrase чтобы подписать транзакцию.

  • signrawtransaction <hex string> [{"txid":txid,"vout":n,"scriptPubKey":hex},...] [,...] [sighash="ALL"] - подписывает транзакцию. Дополнительные необязательные параметры нужны в случае, если требуется создавать цепочку зависящих друг от друга raw транзакций, прежде чем отправлять их в сеть.
  • signrawtransaction 0100000001c9f9f831bca0639b632d697041b835791224bb0dd7f9e20105f4bb00c3a785d5
    0000000000ffffffff02e0930400000000001976a91488aef0056e4db4eb3a8e0b0d4d9fcd62ca23c35b88ac20a10
    700000000001976a91409ec2a6ef3d99c40e91a8b150c7fa31053fbe9af88ac00000000

    Возвратит:

    { "hex" : "0100000001c9f9f831bca0639b632d697041b835791224bb0dd7f9e20105f4bb00c3a785d5000000006c493046
    022100d1fb5ad89dbb550ff97b597134309b787333dfbf237039beba4f5d63b6643e2a022100974c9925315a9a3
    0fe18e4f5b1246b584da571b076e5b98549a18783d3c4d14a012103072d508c683432663b564ffed845bdf2c86
    cebbdc5611a9f33c6d6392c705833ffffffff02e0930400000000001976a91488aef0056e4db4eb3a8e0b0d4d9fcd
    62ca23c35b88ac20a10700000000001976a91409ec2a6ef3d99c40e91a8b150c7fa31053fbe9af88ac00000000", "complete" : true }

    "complete" : true – показывает, что все прошло удачно. Полученный хэш и указываем в следующей команде:


  • sendrawtransaction <hex string> - Передает raw транзакцию в сеть.
  • Возвращает id транзакции или ошибку, если команда по какой-то причине не сработала.

    Можно сразу сказать, что если вы столкнулись с ошибкой: "TX rejected (code -22)", то вот возможные причины:

    - Вы указали хэш транзакции, который получили до ее подписи.

    - Сумма отправляемых монет больше, чем сумма монет на указанных в транзакции инпутах.

    - Выполнение команды signrawtransaction вернуло результат "false".

    - Вы используете input, который уже был отправлен когда-то до этого.

    Дополнительные сведения об ошибках можно смотреть в файлике debug.log, который находится там же, где лежит файл кошелька.

Где может понадобиться использование raw транзакций?

  1. Многоподписанные транзакции.
  2. Управление через консоль.
  3. Выбор монет для отправки (с каких адресов и сколько).
  4. Возможность вручную указать желаемый размер комиссии.
  5. Самостоятельная повторная отправка в сеть транзакции, которая не была включена в блок до этого. Стоит напомнить, что , Bitcoin-Qt и bitcoind сами периодически автоматически ретранслируют транзакции в сеть, пока они не будут приняты в блок.