Raw транзакции – это способ создания транзакций и управления Bitcoin кошельком через командную строку, где полностью вручную можно указать все возможные параметры и обойти ограничения, вносимые графическими оболочками клиентов.
Консоль можно открыть через bitcoin-Qt. Меню: Help -> Debug Window -> вкладка “Concole”. Либо, если используется демон bitcoind, то можно выполнять команды напрямую через терминал операционной системы, например в Windows:
Какие существуют команды?
- listunspent [minconf] [maxconf] ["address",...] - выводит данные о монетах, содержащихся в кошельке.
- txid –ID транзакции;
- vout – номер выхода транзакции;
- scriptPubKey – хэш открытого ключа получателя (Ваш).
- amount – количество монет
- confirmations – число подтверждений транзакции.
- createrawtransaction [{"txid":txid,"vout":n},...] {address:amount,...} - создание транзакции на отправку монет на указанный адрес (или несколько адресов).
- decoderawtransaction <hex string> - возвращает подробные данные о транзакции. Таким образом можно дополнительно проверить, что транзакция сформирована правильно. В качестве hex string вставляем полученный нами ранее хэш транзакции.
- walletpassphrase your_pass timeout
- signrawtransaction <hex string> [{"txid":txid,"vout":n,"scriptPubKey":hex},...] [,...] [sighash="ALL"] - подписывает транзакцию. Дополнительные необязательные параметры нужны в случае, если требуется создавать цепочку зависящих друг от друга raw транзакций, прежде чем отправлять их в сеть.
- sendrawtransaction <hex string> - Передает raw транзакцию в сеть.
Все возможные команды, которые можно использовать в консоли, можно посмотреть командой help. Их действительно очень много. В данной статье будут рассмотрены команды, которые требуются для создания raw транзакций.
minconf и maxconf – необязательные параметры, заставляющие показывать только те монеты, которые имеют количество подтверждений в промежутке между этими значениями включительно. Тем самым можно сократить список вывода, так как иногда он может быть очень длинным, если кошелек активно используется.
Пример команды, выводящей список монет на указанном адресе с числом подтверждений от 10 и больше:
Вывод состоит из 5 элементов:
Более подробно о все элементах, из которых состоит транзакция, можно прочитать в статье Анатомия Bitcoin транзакций, а также статье Транзакции Bitcoin.
txid – id транзакции, которая будет на входе создаваемой
vout – какой выход этой транзакции мы используем.
amount – сколько BTC отправляем.
Следует быть внимательным и не забыть включить в транзакцию комиссию, а то она может быть никогда не включена в блок.
Пример команды:
В данной транзакции 0,003 монеты отправится новому получателю, для 0,005 указываем наш адрес, чтобы они остались при нас. И 0,0005 BTC – оставшиеся монеты - на комиссию.
Ответ возвращает хэш транзакции:
f02e0930400000000001976a91488aef0056e4db4eb3a8e0b0d4d9fcd62ca23c35b88ac20a1070000000000
1976a91409ec2a6ef3d99c40e91a8b150c7fa31053fbe9af88ac00000000
Или, если отправляемые монеты будут браться из нескольких транзакций, то тогда написание команды усложнится, и для двух входящих будет выглядеть примерно так:
По аналогии можно написать команду для сколь угодно длинной транзакции.
Стоит отметить, что после выполнения createrawtransaction транзакция не является подписанной, она не хранится в кошельке и не передается в сеть. То есть вы еще ничего никому не отправили. Вы, по сути, только узнали ее хэш для себя.
Также следует сказать, что никаких проверок корректности транзакции не делается, поэтому можно легко создать невозможную транзакцию или транзакцию с недостаточным размером комиссии, для ее включения в блок.
Если кошелек заблокирован паролем, нужно сначала его ввести перед последующим подписанием транзакции, использовав команду:
timeout – указывается число секунд, сколько авторизация с этим паролем будет действовать. После истечения этого времени, потребуется заново выполнять команду walletpassphrase чтобы подписать транзакцию.
0000000000ffffffff02e0930400000000001976a91488aef0056e4db4eb3a8e0b0d4d9fcd62ca23c35b88ac20a10
700000000001976a91409ec2a6ef3d99c40e91a8b150c7fa31053fbe9af88ac00000000
Возвратит:
022100d1fb5ad89dbb550ff97b597134309b787333dfbf237039beba4f5d63b6643e2a022100974c9925315a9a3
0fe18e4f5b1246b584da571b076e5b98549a18783d3c4d14a012103072d508c683432663b564ffed845bdf2c86
cebbdc5611a9f33c6d6392c705833ffffffff02e0930400000000001976a91488aef0056e4db4eb3a8e0b0d4d9fcd
62ca23c35b88ac20a10700000000001976a91409ec2a6ef3d99c40e91a8b150c7fa31053fbe9af88ac00000000", "complete" : true }
"complete" : true – показывает, что все прошло удачно. Полученный хэш и указываем в следующей команде:
Возвращает id транзакции или ошибку, если команда по какой-то причине не сработала.
Можно сразу сказать, что если вы столкнулись с ошибкой: "TX rejected (code -22)", то вот возможные причины:
- Вы указали хэш транзакции, который получили до ее подписи.
- Сумма отправляемых монет больше, чем сумма монет на указанных в транзакции инпутах.
- Выполнение команды signrawtransaction вернуло результат "false".
- Вы используете input, который уже был отправлен когда-то до этого.
Дополнительные сведения об ошибках можно смотреть в файлике debug.log, который находится там же, где лежит файл кошелька.
Где может понадобиться использование raw транзакций?
- Многоподписанные транзакции.
- Управление через консоль.
- Выбор монет для отправки (с каких адресов и сколько).
- Возможность вручную указать желаемый размер комиссии.
- Самостоятельная повторная отправка в сеть транзакции, которая не была включена в блок до этого. Стоит напомнить, что , Bitcoin-Qt и bitcoind сами периодически автоматически ретранслируют транзакции в сеть, пока они не будут приняты в блок.