8 - 2 建立 P2SH 結構

任何一個 P2SH 交易都要先準備一個鎖定腳本,任何一個 chapter 7, 9 - 10的腳本,只要

序列化後的 redeemScript 小於等於 520 bytes,都可以當作鎖定腳本。

520 bytes 這個限制是因為比特幣要向後兼容,新功能要能夠讓以前的系統使用。

比特幣的棧最多只能放上 520 bytes,因為 redeemScript 在執行時是全部推到棧上,

所以要符合這個限制。

序列化鎖定腳本

有了鎖定腳本後,需要將它序列化才能放進以特幣交易裡,胥役的是兩步驟:

把腳本變成 hexcode,再把 hexcode 轉成binary

產生 Hexcode

產生方式就是把腳本的每一個元素翻譯成對應的 1-byte hex 碼,

  • 運算子翻譯成對應的 1-byte 運算碼
  • 1 - 16 翻譯成 0x51 ~ 0x61 (OP_1 ~ OP_16)
  • -1 翻譯成 0x4f (OP_1NEGATE)
  • 其餘的常數會加上前綴 0x01 ~ 0x4e,整數會用 little-endian, signed-magnitude 的方式翻譯
翻譯整數

第一,正數必須在 -2147483647 ~ 2147483647 之間(4 bytes,most significant 位元用來標記正負)

第二,要把十進位轉成十六進位,然後要用偶數個位數表示,可以用 printf 表示

參考:https://stackoverflow.com/questions/14733761/printf-formatting-for-hex

sed 是管線指令,可以用來對 standard input 做取代、刪除、新增、擷取

$ integer=1546288031
$ hex=$(printf '%08x\n' $integer | sed 's/^\(00\)*//')
$ echo $hex
5c2a7b9f

太麻煩...有空研究

Hexcode 轉成 Binary

用指令 xxd -r -p


分析 P2SH 多簽交易

兩種方法可以看出 redeemScript 內容是什麼,一是從 Bitcoin Wiki 去翻譯

二是使用 bitcoin-cli decodescript

$ bitcoin-cli -named decodescript hexstring=52210307fd375ed7cced0f50723e3e1a97bbe7ccff7318c815df4e99a59bc94dbcd819210367c4f666f18279009c941e57fab3e42653c6553e5ca092c104d1db279e328a2852ae
{
  "asm": "2 0307fd375ed7cced0f50723e3e1a97bbe7ccff7318c815df4e99a59bc94dbcd819 0367c4f666f18279009c941e57fab3e42653c6553e5ca092c104d1db279e328a28 2 OP_CHECKMULTISIG",
  "reqSigs": 2,
  "type": "multisig",
  "addresses": [
    "mg7YqyvK8HUFvpgZ5iYTfZ5vjfaJWnNTd9", 
    "mfduLxpR6Bq1ARctV2TauhetWwqnqH1vYS"
  ],
  "p2sh": "2NAGfA4nW6nrZkD5je8tSiAcYB9xL2xYMCz"
}

對序列腳本做 Hash

在產生鎖定腳本以及序列化後,第三步是對序列畫的結果做 hash,做法是先 SHA-256 後做 RIPEMD-160,

並產生 20-bytes 的 hash 字串。

範例:

$ redeemScript="52210307fd375ed7cced0f50723e3e1a97bbe7ccff7318c815df4e99a59bc94dbcd819210367c4f666f18279009c941e57fab3e42653c6553e5ca092c104d1db279e328a2852ae"
$ echo -n $redeemScript | xxd -r -p | openssl dgst -sha256 -binary | openssl dgst -rmd160
(stdin)= babf9063cee8ab6e9334f95f6d4e9148d0e551c2

建立 P2SH 交易

上面是產生了 P2SH 交易內的鎖定腳本 Hash,我們需要將這個 Hash 跟其他操作碼放進 P2SH 交易裡,

範例: OP_HASH160 babf9063cee8ab6e9334f95f6d4e9148d0e551c2 OP_EQUAL

我們也需要把這個 P2SH 鎖定腳本做上面的產生 Hexcode 步驟(不用序列化),也就是把 OP_HASH160 -> a914

OP_EQUAL -> 87,所以上面的 P2SH 腳本可以翻譯成 a914babf9063cee8ab6e9334f95f6d4e9148d0e551c287

results matching ""

    No results matching ""