8 - 4 多簽腳本

在有 P2SH 之前,多簽交易也可以執行

了解多簽交易

多簽交易的鎖定腳本為0 ... sigs ... <m> ... addresses ... <n> OP_CHECHMULTISIG

OP_CHECKMULTISIG 執行時,會做以下步驟:

  1. 從棧上拿出 <n>
  2. 從棧上拿出 n 個元素,做為比特幣地址,等等要比對
  3. 從棧上拿出 <m>
  4. 從棧上拿出 m 個簽章
  5. 拿出 0,這個 0 是以前的 bug
  6. 驗證簽章和地址
  7. 回覆 True 或 False

建立多簽原型 (raw MultiSig)

多簽是比特幣的標準交易之一,只要交易的鎖定腳本用了 OP_CHECKMULTISIG原型,那麼比特幣網路就會接受它。

現在假設我們要產生 2-of-2 多簽,那麼鎖定腳本為:

2 $address1 $address2 2 OP_CHECKMULTISIG

解鎖多簽原型

多簽原型的解鎖腳本是 0 開頭,附加上需要的 m 個簽章,例如:

0 $signature1 $signature2

執行多簽原型

我們把 scriptSig scriptPubKey 擺在一起

Script: 0 $signature1 $signature2 2 $address1 $address2 2 OP_CHECKMULTISIG
Stack: [ ]

首先會將所有的東西都推到棧上

Script: OP_CHECKMULTISIG
Stack: [ 0 $signature1 $signature2 2 $address1 $address2 2 ]

接著執行 OP_CHECKMULTISIG,2(n) 會先拿出來,接著拿出 2 個地址

Running: OP_CHECKMULTISIG
Stack: [ 0 $signature1 $signature2 2 $address1 $address2 ]

Running: OP_CHECKMULTISIG
Stack: [ 0 $signature1 $signature2 2 ]

再來是拿出 2(m),在拿出兩個簽章

Running: OP_CHECKMULTISIG
Stack: [ 0 $signature1 $signature2 ]

Running: OP_CHECKMULTISIG
Stack: [ 0 ]

最後 0 會被拿出,接著再比對簽章和地址

Script:
Stack: [ True ]

這裡可以看到兩個問題,第一個是 MultiSig 地址太長了,如果m, n 都很大,那麼一筆交易的腳本就會非常大,

第二個是因為交易大,所以手續費會很嚇人

所以 P2SH 就是用來解決這個問題,通常多簽會用 P2SH MultiSig 來做

我們會把 MultiSig 交易包在 P2SH 裡面去做,這樣上面兩點都解決了:地址可以有效地縮短,手續費因此降低,m, n可以變大。


P2SH MultiSig

results matching ""

    No results matching ""