Как установить произвольный scriptPubKey во время генерации транзакции условного депонирования биткойна?
В соответствии с Примером 2: Посредничество условного депонирования и разрешения споров существует возможность создавать сделки условного депонирования. Также есть BIP 16, который вводит механизм оплаты за скрипт-хэш.
Согласно этим документам, как я понимаю, я должен выполнить следующие шаги для обработки сделки условного депонирования между тремя участниками:
- Каждый из этих трех участников создает новый адрес, выполняя команду rpc "getnewaddress".
- Затем каждый должен проверить свои адреса, выполнив "validateaddress" и получить ключ доступа.
Затем мы должны создать адрес мультисигнала, выполнив метод rpc "createmultisig" с тремя аргументами в качестве параметров, например так:
bitcoind createmultisig 2 '["pubkey1","pubkey2","pubkey3"]'
Затем мы создаем транзакцию, чтобы положить несколько монет на этот многозначный адрес:
bitcoind createrawtransaction '[{"txid":"my some txid","vout":0}]' '{"created multisig address":0.001}'
После этого мы должны декодировать нашу созданную транзакцию, выполнив "decoderawtransaction", чтобы получить txid, который понадобится для создания следующей транзакции:
`bitcoind decoderawtransaction <blah-blah>
{ "txid": "txid, который нам нужен", "версия": 1, "время блокировки": 0, <...> и т. д. <...>}`
Один из последних шагов: мы должны создать наш собственный scriptPubKey. Хорошо, это не проблема: мы можем использовать Pybitcointools, библиотеку Python для биткойн-подписей и транзакций, чтобы сделать это, выполнив
pybtctool mk_multisig_script pub_key1 pub_key2 pub_key3 2 3
в результате мы получаем scriptPubKey, который мы должны использовать позже в другой транзакции createrawtransaction.Заключительный этап. Волшебство начинается. Мы выполняем bitcoind для создания необработанной транзакции с помощью специального скрипта:
bitcoind createrawtransaction '[{"txid":"txid","vout":0,"scriptPubKey":"**scriptPubKey**","redeemScript":"redeemScript from createmultisig transaction above"}]' '{"bitcoin address to output":0.001}'
и это возвращает транзакцию.
Магия: все выше работает отлично. Final createrawtransaction создает транзакцию. Но когда мы декодируем полученную транзакцию, выполняя bitcoind decoderawtransaction <transaction, received on the last step>
в разделе vout будет что-то вроде этого: "vout" : [
{
"value" : 0.00100000,
"n" : 0,
"scriptPubKey" : {
"asm" : "OP_DUP OP_HASH160 blah blah OP_EQUALVERIFY OP_CHECKSIG",
"hex" : "blah blah",
Как видите, в scriptPubKey есть "OP_CHECKSIG", но наш скрипт должен иметь "OP_CHECKMULTISIGVERIFY"
Итак, вопрос: как установить произвольный скрипт на вывод транзакции?
1 ответ
Я борюсь с той же проблемой, что и вы, но, может быть, я немного дальше? Далее я бы:transaction=pybitcointools.deserialize(hex)
transaction["outs"][n]["script"]=**script pub key**
hex=pybitcointools.serialize(transaction)
Я не думаю, что вы используете скрипт погашения, пока не захотите потратить биткойн, который вы отправляете с этой транзакцией?
ОБНОВЛЕНИЕ https://bitcoin.stackexchange.com/questions/4486/transaction-with-slightly-changed-script-is-never-relayed Похоже, наш клиент откажется транслировать эти транзакции, мы должны передать их конкретный пул шахтеров.
Если вы хотите больше сотрудничать: zack[dott]bitcoin@gmail.com