6 - 1 MultiSig
MultiSig 讓我們可以發送交易到多方,讓一筆交易要經過多方驗證才能成功
了解 MultiSig 原理
在基本的 P2PKH 交易,比特幣是送到一個基於公鑰的地址,也就是接收方要有這個公鑰的配對私鑰才能解鎖該交易,
那如果我們想要把一筆交易用多個私鑰上鎖呢?這樣交易可以送到一個團體,等到大家都驗證或同意後才能動用這筆交易。
多重簽章是允許多個人一起建立「聯合數位簽章」(joint digital signature),比起直接蒐集所有人的簽章來得有效率。
一個多簽交易是用 OP_CHECKMULTISIG 來建立,通常會放在 P2SH 地址上。
我們可以用 bitcoin-cli 建立多簽地址,資金可以在這個地上傳遞,跟普通的 P2PKH 一樣,但需要多個私鑰才能解鎖交易。
多簽交易是一種比特幣交易,他是送到多簽地址,所以需要某團體的幾個私鑰才能解鎖這筆交易。
簡單的多簽交易需要團體的所有私鑰才能解鎖交易,但是我們可以建立 "m of n" 多重簽章,也就是交易被 n 個私鑰鎖定,
但是只要 m 個私鑰就可以解鎖,m <= n。
建立多簽地址
建立多簽地址之前,要先建立個別的 P2PKH 地址,最好的方式是每個人都在自己的機器上用 getnewaddress 產生新地址
machine1$ address1=$(bitcoin-cli getnewaddress)
and
machine2$ address2=$(bitcoin-cli getnewaddress)
接著其中一個接收方會蒐集簽章
收集公鑰
比特幣地址是公鑰的 Hash 值,不是公鑰本身,要建立多簽地址需要原始的公鑰,不過別擔心,
完整的公鑰出現在錢包資訊裡, bitcoin-cli 可以取得那個資訊,每個要參加多簽地址的人都需要將原始的公鑰給多簽建立者,
用 validateaddress 可以獲得地址的資訊
machine2$ bitcoin-cli -named validateaddress address=$address2
{
"isvalid": true,
"address": "mwqtkrfKwN99y3anfBPbfNa7ot6RpAGbRN",
"scriptPubKey": "76a914b316f66922dd0a5c00655f3b8812e23c85f5ae6788ac",
"ismine": true,
"iswatchonly": false,
"isscript": false,
"pubkey": "03363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f4",
"iscompressed": true,
"account": "",
"timestamp": 1520661120,
"hdkeypath": "m/0'/0'/2'",
"hdmasterkeyid": "655e8349ece93f3e5c30198ce2d1bf5edff2c446"
}
pubkey
: 03363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f4
就是我們想要的
有了之後可以用 createmultisig
建立多簽地址
machine1$ bitcoin-cli -named createmultisig nrequired=2 keys='''["'$address1'","03363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f4"]'''
{
"address": "2N5CBdYjGPqMb1KByBcVzxa111HmzZA98Ua",
"redeemScript": "5221030fbad31b826a9f50413666c58ff6b543d734d45911139b854c10e6bb45b212b92103363ca4119706a82e3d5260568bf5abdefe1dbe79b1765c01669e635af26f61f452ae"
}
nrequired
是 m of n 地址的 m 需求數,keys
才是 n ,keys 裡面可以放原始公鑰或是 P2PKH的地址,如果是 P2PKH 地址
createmultisig
會去本地錢包找原始公鑰資訊,如果找到就會建立多簽地址,沒找到會跳出錯誤訊息。
成功會有兩個回傳值,第一個是地址,就是傳遞資金用的地址,在測試網路多簽地址是 2 開頭 ,
因為實際上多簽地址是建立 P2SH地址。
第二個是 redeemScript
,履行腳本,也就是寫上要怎麼讓這筆資金可以使用的條件。
什麼是 P2SH 地址? P2SH 是一種新的「地址」,這種地址可以用更複雜的腳本讓資金被贖回,比特幣用 P2SH 讓多簽標準化。
儲存多簽地址
剛剛建立的東西都不會存在錢包裡,為了之後可以履行交易,我們要記下兩個東西:
- 用在多簽地址的比特幣地址
- 履行腳本
履行腳本可以用 createmultisig
在看一次,但是地址放的順序要跟一開始一樣!
交易到多簽地址
建立交易跟以前一樣: seal, sign, deliver
$ utxo_txid=$(bitcoin-cli listunspent | jq -r '.[0] | .txid')
$ utxo_vout=$(bitcoin-cli listunspent | jq -r '.[0] | .vout')
$ recipient="2N5CBdYjGPqMb1KByBcVzxa111HmzZA98Ua"
$ bitcoin-cli -named decoderawtransaction hexstring=$rawtxhex
{
"txid": "87dc58dae3c72ed9e903799a8b2d40a08e73498f5958867763beb5daa3e35afc",
"hash": "87dc58dae3c72ed9e903799a8b2d40a08e73498f5958867763beb5daa3e35afc",
"version": 2,
"size": 83,
"vsize": 83,
"locktime": 0,
"vin": [
{
"txid": "69d282325ce2e3e584fab94e472270d14d728e85f77ca1c62486535aafca4b56",
"vout": 0,
"scriptSig": {
"asm": "",
"hex": ""
},
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.00900000,
"n": 0,
"scriptPubKey": {
"asm": "OP_HASH160 830e4b26e7bfe724b9f9de7f8bb8c1f6463452b3 OP_EQUAL",
"hex": "a914830e4b26e7bfe724b9f9de7f8bb8c1f6463452b387",
"reqSigs": 1,
"type": "scripthash",
"addresses": [
"2N5CBdYjGPqMb1KByBcVzxa111HmzZA98Ua"
]
}
}
]
}
$ signedtx=$(bitcoin-cli -named signrawtransaction hexstring=$rawtxhex | jq -r '.hex')
$ bitcoin-cli -named sendrawtransaction hexstring=$signedtx
7d2142fb20eb5753d29d96886b86f244949e68c9cc07c6cca4973a8985518cc0
小總結:
多簽用多個私鑰鎖定資金,最多要求所有的私鑰去贖回交易,也可以只要求幾個私鑰即可。
多簽交易可以用在公司、合夥、委員會或是團體等等,1-of-2 多簽可以用在結婚的兩人,2-of-2 可以用在合夥關係。