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 可以用在合夥關係。

results matching ""

    No results matching ""