環境
bitcoin-ruby v0.0.18
ruby v2.6.0(by rbenv)
bitcoind v0.17.0.0-5b47b8efd
bitcoin-cli v0.17.0.0-5b47b8efd
やること
p2pkhマルチシグスクリプトでロックされたトランザクションをinputにして、そのスクリプトをアンロックするトランザクションをbitcoin-ruby
で作成する
bitcoin-rubyでつくるその他のトランザクション
一般的なp2pkhトランザクションをbitcoin-rubyで
p2pkhマルチシグトランザクションをbitcoin-rubyで
今回行うことのサンプルコードはこちら
inputを作成する
一般的なp2pkhトランザクションとほぼ同じ。
Builder
モジュールを使ってトランザクションを作成する。
signature_key
に渡すKey
インスタンスが複数になる場合があるだけである。
複数の場合は配列で渡せばよいです。
今回仮定する変数は以下とする。
項目 | 値 |
---|---|
前トランザクション | da85de487c78bd312ab6806f6497f5ad1b9c480d3f71869b7472919959ba99be |
前スクリプト | 522102ec35d437a41da7ab7f8b8024377ff6b532b49fb95804a73c41af6510663eaf4121039976de4fc156fe8dc5282d89eaf7ddc5e26494877eb8d995d732cd87791a45f421036647aa901188f4e784bd251e8ddb7802239b911ab66fa90165a3fe5320328ebf53ae |
outputインデックス | 0 |
有効な署名を作成できる秘密鍵1 | cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB |
有効な署名を作成できる秘密鍵2 | cPJSC2SZqW3d9EWZTWtnDdGUQY7HFWcCH3cSm4kkkDpidJxp188N |
有効な署名を作成できる秘密鍵3 | cMujetBk2WXGwnyA1pWZHYLrGVwk1h5V4nYnCQhr9kJshWKPgNpZ |
potential_signers = [
'cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB',
'cPJSC2SZqW3d9EWZTWtnDdGUQY7HFWcCH3cSm4kkkDpidJxp188N',
'cMujetBk2WXGwnyA1pWZHYLrGVwk1h5V4nYnCQhr9kJshWKPgNpZ',
]
signers = potential_signers.sample(2).map do |address|
Bitcoin::Key.from_base58 address
end
tx = build_tx do |t|
t.input do |i|
i.prev_out 'da85de487c78bd312ab6806f6497f5ad1b9c480d3f71869b7472919959ba99be' #txid
i.prev_out_index 0
i.prev_out_script '522102ec35d437a41da7ab7f8b8024377ff6b532b49fb95804a73c41af6510663eaf4121039976de4fc156fe8dc5282d89eaf7ddc5e26494877eb8d995d732cd87791a45f421036647aa901188f4e784bd251e8ddb7802239b911ab66fa90165a3fe5320328ebf53ae'.htb
i.signature_key signers
end
end
output
outputは任意のスクリプト宛に作成します。
一般的なp2pkhスクリプトにした場合以下のようになります。
potential_signers = [
'cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB',
'cPJSC2SZqW3d9EWZTWtnDdGUQY7HFWcCH3cSm4kkkDpidJxp188N',
'cMujetBk2WXGwnyA1pWZHYLrGVwk1h5V4nYnCQhr9kJshWKPgNpZ',
]
signers = potential_signers.sample(2).map do |address|
Bitcoin::Key.from_base58 address
end
# Recipient
# recipient address muaJ6gXpMn6mUQxbAtgDUnnaNDVDfX6emo
# dumpprivkey get WIF privkey cNBfQu3fAJ1QXMrLvd4PGNAd7RzjUj62kHbkL9owNF2zN2g3M4GB
privkey = 'cTx5t224vzS8vXWpfZJwCMEvkGA89APnzy94umbscgovjLU7HitV'
recipient = Bitcoin::Key.from_base58(privkey)
tx = build_tx do |t|
t.input do |i|
i.prev_out 'da85de487c78bd312ab6806f6497f5ad1b9c480d3f71869b7472919959ba99be' #txid
i.prev_out_index 0
i.prev_out_script '522102ec35d437a41da7ab7f8b8024377ff6b532b49fb95804a73c41af6510663eaf4121039976de4fc156fe8dc5282d89eaf7ddc5e26494877eb8d995d732cd87791a45f421036647aa901188f4e784bd251e8ddb7802239b911ab66fa90165a3fe5320328ebf53ae'.htb
i.signature_key signers
end
t.output do |o|
o.value 1998000000
o.to recipient.addr
end
end
サンプルコードはこちらです。