8 - 4 多簽腳本
在有 P2SH 之前,多簽交易也可以執行
了解多簽交易
多簽交易的鎖定腳本為0 ... sigs ... <m> ... addresses ... <n> OP_CHECHMULTISIG
當 OP_CHECKMULTISIG
執行時,會做以下步驟:
- 從棧上拿出 <n>
- 從棧上拿出 n 個元素,做為比特幣地址,等等要比對
- 從棧上拿出 <m>
- 從棧上拿出 m 個簽章
- 拿出 0,這個 0 是以前的 bug
- 驗證簽章和地址
- 回覆 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