Вот как отправить необработанную транзакцию BTC с помощью команды Bitcoin-cli

Сценарий:

Майкл получает 0,05000000 BTC от Пабло и еще 0,01000000 BTC от Кураданга. Майкл также хочет отправить Бертенгу 0,02500000 BTC. Каждая сумма, которую получает Майкл, имеет соответствующий txid и другие детали. Давайте проверим это с помощью команды listunspent, затем создадим необработанную транзакцию с помощью createrawtransaction, после этого подпишем ее с помощью signrawtransaction и отправим эту необработанную транзакцию с помощью sendrawtransaction.

Дано:

  • Биткойн-адрес Майкла: mkrzDhhZtzQm8zgckSs4fMNrvtNJ66zaFe
  • Биткойн-адрес Berteng: mxh3H416KCRoBDiweSESew5YJyAk1nxLrN
  • Отправить на Berteng: 0,02500000 mBTC

Шаг 1)

listunspent

Формат:

$ bitcoin-cli listunspent [misconf=1] [max_number_confirmation=99999999] '''["<wallet_address>"]'''

Давайте сверим список неизрасходованных средств Майкла с его адресом.

Выполнить:

$ bitcoin-cli listunspent 1 99999999 '''["mkrzDhhZtzQm8zgckSs4fMNrvtNJ66zaFe"]'''

Результат:

[{
    "txid": "12b8e7ede4992f4d30f93idj3085746951d945e39f40becebd7c290af8c2e7ad",
    "vout": 1,
    "address": "mkrzDhhZtzQm8zgckSs4fMNrvtNJ66zaFe",
    "account": "micz",
    "scriptPubKey": "76a9143aa28e1740a6a5a2190975b6e7f1ad67aaec9a3988ac",
    "amount": 0.05000000,
    "confirmations": 94,
    "spendable": true
}, {
    "txid": "8443bc63b65d569ff9ekwm37sy3b67b9c7c6f8f386c3cdf372b260961b64ec9fc",
    "vout": 1,
    "address": "mkrzDhhZtzQm8zgckSs4fMNrvtNJ66zaFe",
    "account": "micz",
    "scriptPubKey": "76a9143aa28e1740a6a5a2190975b6e7f1ad67aaec9a3988ac",
    "amount": 0.01000000,
    "confirmations": 93,
    "spendable": true
}]

Здесь мы видим результаты, по которым нашему адресу mkrz… были присвоены 50 и 10 mBTC. Чтобы провести этот вывод, мы создадим новую транзакцию.

Шаг 2)

createrawtransaction

Нам нужно выбрать несколько блоков с достаточным количеством из результата listunspent. Поскольку нам нужно отправить всего 0,02500000 mBTC, я думаю, что в первом блоке достаточно суммы для совершения транзакции.

Формат:

$ bitcoin-cli createrawtransaction
    '[{
        "txid" : "<txid_of_selected_block>",
        "vout" : <vout>
    }]'
    '{"<recipient_address>": <amount_to_send>, "<sender_address>": <amount_change>}'

Чтобы заплатить комиссию, мы уменьшим вывод сдачи на 0,5 миллибит, как вы можете видеть ниже.

Выполнить:

$ bitcoin-cli createrawtransaction
    '[{
        "txid" : "12b8e7ede4992f4d30f93idj3085746951d945e39f40becebd7c290af8c2e7ad",
        "vout" : 0
    }]'
    '{"mxh3H416KCRoBDiweSESew5YJyAk1nxLrN": 0.025, "mkrzDhhZtzQm8zgckSs4fMNrvtNJ66zaFe": 0.0245}'

Результат

0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c0000000000ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000

Команда createrawtransaction создает необработанную шестнадцатеричную строку, которая кодирует предоставленные нами сведения о транзакции. Если вы хотите декодировать шестнадцатеричный код, просто используйте команду decoderawtransaction.

Шаг 3)

signrawtransaction

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

Формат:

$ bitcoin-cli signrawtransaction <hex_createrawtransaction>

Выполнить:

$ bitcoin-cli signrawtransaction 0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c0000000000ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000

Результат:

{
   "hex" : "0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c000000006a47304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a06012103c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000",
   "complete" : true
}

Теперь команда signrawtransaction возвращает еще одну необработанную транзакцию в шестнадцатеричном коде.

Шаг 4)

sendrawtransaction

RPC проверяет транзакцию и передает ее в одноранговую сеть.

Формат:

$ bitcoin-cli sendrawtransaction <hex_signrawtransaction>

Выполнить:

$ bitcoin-cli sendrawtransaction 0100000001e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c000000006a47304402203e8a16522da80cef66bacfbc0c800c6d52c4a26d1d86a54e0a1b76d661f020c9022010397f00149f2a8fb2bc5bca52f2d7a7f87e3897a273ef54b277e4af52051a06012103c9700559f690c4a9182faa8bed88ad8a0c563777ac1d3f00fd44ea6c71dc5127ffffffff02a0252600000000001976a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac50622500000000001976a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac00000000

Результат:

ae74538baa914f3799081ba78429d5d84f36a0127438e9f721dff584ac17b346

Команда sendrawtransaction возвращает хэш транзакции (txid) при отправке транзакции в сеть. Чтобы проверить хэш транзакции, перейдите на страницу tbtc.blockr.io

Для получения дополнительной информации посетите этот сайт освоение биткойнов


person Michael Blanza    schedule 21.07.2016    source источник
comment
listunspent с биткойн-адресом не работает для меня ... edit: теперь это сработало! Благодарность! эта функция даже не задокументирована ..   -  person tObi    schedule 12.02.2017
comment
Почему на входе транзакции, которую вы создаете, vout равен 0, если он равен 1 в указанной транзакции, которую можно потратить?   -  person user1035617    schedule 21.01.2019
comment
@ user1035617 Я считаю, что это ошибка. Выходной номер должен совпадать с номером неизрасходованной транзакции.   -  person FedFranz    schedule 02.09.2019


Ответы (3)


Реализация отправки rawtransaction с несколькими подписями в среде regtest)

1) Создайте необработанную транзакцию

синтаксис:

bitcoin-cli -regtest createrawtransaction '[{"txid": "", "vout":}]' '{"receive_address": amount}'

Пример:

 > bitcoin-cli -regtest createrawtransaction
    > '[{"txid":"eee0de90e9878c039f87c9eedbdf5b9a5da157b19e5354a51ff3b2f84c8a901b","vout":0},]'
    > '{"2MxieCJNTKiiBj6U3SjghQaatZYbM7Qn6GW":30}'

2) Подпишите исходную транзакцию

синтаксис

<hexstring> [{"txid":txid,"vout":n,"scriptPubKey":hex},...] [<privatekey1>,...]
bitcoin-cli -regtest signrawtransaction "0200000001a1c33ebb12d94f96effc70c9dd4488faf32dc15269d6a41d115ac956033cadbb0100000000ffffffff0100e1f505000000001976a9145768a869521bb01af8bdd787e6e1e65ec3d9870e88ac00000000" '''
        [
          {
            "txid":"bbad3c0356c95a111da4d66952c12df3fa8844ddc970fcef964fd912bb3ec3a1",
            "vout":1,
            "scriptPubKey":"a91401a8f0509da2396f58d3f9948a76331964524c9687",
            "redeemScript": "5221022d6f957dd76773432d2493edb5601b2d0791286e31c83483ab299672c3d44fc921022dd9c36eece99cc308986a8334c3a0bf24d7ef8b842dacebf56f2477b0f6daab21030544c9613bf27c9773e6fcd79c7786a297188a2647d346da0c3305e22d3e28da53ae"
          }
        ] 
    ''' '''
    [
    "cUdhE3NvePyjqksgJTc5BQfXGDJckPgEKfoRT72x2BRoG2uMS81H"
    ]
    '''

o / p будет шестнадцатеричным, которое я сохраню как

signed_raw_txn = 0200000001a1c33ebb12d94f96effc70c9dd4488faf32dc15269d6a41d115ac956033cadbb01000000fdfe0000483045022100f9561640d9cf6c7fa7decdd2a3e0c40b0f05d167ee96f22dc11b7ef120c8483902201e53915eed3399e07a4e2648ab76c665fca6486d872d10964ad1926e792d2d6001483045022100a0a084182fb84efdf21757b9caa723cb013a469dc47c5bd8007c23f6201260c8022014fa11cb241c2e63ed0a043aceb1c3f89344c22b4ea6662f93da30820ef18796014c695221022d6f957dd76773432d2493edb5601b2d0791286e31c83483ab299672c3d44fc921022dd9c36eece99cc308986a8334c3a0bf24d7ef8b842dacebf56f2477b0f6daab21030544c9613bf27c9773e6fcd79c7786a297188a2647d346da0c3305e22d3e28da53aeffffffff0100e1f505000000001976a9145768a869521bb01af8bdd787e6e1e65ec3d9870e88ac00000000

3) Отправить rawtransaction

bitcoin-cli -regtest sendrawtransaction $signed_raw_txn
person cryptoKTM    schedule 19.01.2018

Еще один более простой способ с дополнительным fundrawtransaction. Документы говорят нам, какие вводятся и выводят все обязательные поля. Но не забывайте, что пустой список тоже объект:

Шаг 1)

$ bitcoin-cli createrawtransaction '[]' \
    '{"mxh3H416KCRoBDiweSESew5YJyAk1nxLrN": 0.025}'

Шаг 2)

$ bitcoin-cli fundrawtransaction <hex_createrawtransaction> \
    '{"changeAddress": "mkrzDhhZtzQm8zgckSs4fMNrvtNJ66zaFe"}'

После второго шага вы можете посмотреть комиссию, созданную вашим кошельком. И измените его с помощью опции feeRate команды fundrawtransaction. Все это можно сделать до того, как подписать и отправить в сеть вашу транзакцию.

person Sergey Voronezhskiy    schedule 08.10.2017
comment
Спасибо ... это сэкономило мне много работы .... У меня вопрос: как это генерирует комиссию? Плата за высокий приоритет или за низкий? Можно ли изменить приоритет? Будет ли взимаемая таким образом плата отражать текущую загруженность сети? - person user3931836; 18.05.2020

У меня нет 50 очков репутации, чтобы прокомментировать user3931836, но как он генерирует комиссию? В чем ее приоритет? Влияет ли перегрузка сети на плату?

  1. Комиссия - это любая сумма, которая останется после вычитания общих выходных сумм из общих входных сумм UTXO:

комиссия = (сумма UTXO) - (общая отправленная сумма)

т.е. сумма комиссии явно не указана; майнер просто сохраняет все, что не указано в выходных данных, оставшуюся сумму. Таким образом, вам следует сократить объем сдачи, чтобы гарантировать, что их достаточно для покрытия комиссии.

  1. Плата не имеет ни высокого, ни низкого приоритета. Сама транзакция становится высокоприоритетной (для майнеров), поскольку вы решаете оставить майнеру более высокую сумму комиссии (майнеры жадны и выбирают транзакции, которые платят больше, что выбирает сам плательщик).
  2. Комиссия зависит от объема данных, которые вы отправляете в транзакции. Майнер смотрит на количество байтов в вашей транзакции, затем на комиссию, которую вы платите за транзакцию, затем вычисляет комиссию / байт для определения приоритета транзакции.

Помните, что если ваша транзакция использует 50 UTXO, то у нее МНОГО байтов, поэтому они будут ожидать большой платеж. Но если ваша транзакция использует только 1 UTXO, тогда она использует НАМНОГО меньше байтов, поэтому вы можете платить меньше. Убедитесь, что вы оптимизировали свой выбор UTXO, чтобы уменьшить количество байтов в транзакции - тогда вы можете предоставить меньшую комиссию, не влияя на приоритет очереди. В настоящее время майнеры ожидают около 40 сатоши на байт, но проверьте онлайн-инструмент, чтобы узнать приблизительное время обработки для различных объемов. Если вы заплатите им меньше (за байт), они оставят вас в мемпуле на более длительный срок (как более низкий приоритет в их контексте).

person Lucy Smith    schedule 13.04.2021