區塊鏈重要基礎知識7-1——標準腳本P2PKH、P2SH

這裏主要用於補充區塊鏈重要基礎知識7——比特幣的運行機制中標準協議P2SH的說明
五大標準腳本分別爲P2PKH、P2PK、MS(限15個密鑰)、P2SH和OP_Return。

這裏主要介紹P2PKH、P2SH,因爲這兩個比較常見。

1.P2PKH

Alice向Bob咖啡館支付的案例。Alice下達了向Bob咖啡館的比特幣地址支付0.015比特幣的支付指令,該筆交易的輸出內容爲以下形式的

1.1 鎖定腳本(用堆棧實現hash值的對比):

OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG OP\_DUP \space OP\_HASH160 \space <Cafe \space Public \space Key \space Hash> \space OP\_EQUAL \space OP\_CHECKSIG
Cafe Public Key Hash即爲咖啡館的比特幣地址,但這個地址不是基於Base58CheckBase58Check編碼的,是十六進制

1.2 鎖定腳本的解鎖版腳本是:

<Cafe Signature> <Cafe Public Key> <Cafe \space Signature> \space <Cafe \space Public \space Key>

1.3 判斷

只有當解鎖版腳本與鎖定版腳本的設定條件相匹配時,執行組合有效腳本時纔會顯示結果爲真(Ture)

也就是隻有當解鎖腳本得到了咖啡館的有效簽名,交易執行結果纔會被通過(結果爲真),該有效簽名是從與公鑰哈希相匹配的咖啡館的私鑰中所獲取的。

1.4 圖示

指令 指令詞源 16進制字節碼 功能說明
OP_DUPOP\_DUP duplicate 0x76 複製棧頂元素
OP_HASH160OP\_HASH160 hash 0xa9 彈出棧頂元素,先進行SHA-256哈希,再進行RipeMD160哈希處理,將結果壓入棧。
OP_EQUALVERIFYOP\_EQUALVERIFY equal verify 0x88 彈出棧頂兩個元素,如果兩個內容一致,則返回1,腳本繼續執行。否則返回0,腳本中斷執行。
OP_CHECKSIGOP\_CHECKSIG check signature 0xac 彈出棧頂兩個元素,用公鑰檢查輸入中的簽名,驗證該簽名是否擁有該公鑰的用戶用其私鑰簽署的。如果簽名符合,則將true(true = 1) 壓入棧頂。
OP_CHECKMULTISIGOP\_CHECKMULTISIG check multiple signature 0xae 用多個公鑰檢查多重簽名的正確性。
OP_RETURNOP\_RETURN return 0x6a 標記交易無效
OP_PUSHOP\_PUSH 下面多少個字節要被壓入堆棧
OP_TRUR/OP_1OP\_TRUR/OP\_1 數字1被壓入堆棧
OP_FALSE/OP_1OP\_FALSE/OP\_1 一個字節空串被壓入堆棧

P2PKH1
P2PK

2.P2SH

對應有鎖定腳本與贖回腳本,這就是我們經常稱它爲贖回腳本的原因,其實就是hash匹配之後將原本的hash之前的值拿回來

2.1 最初的多重簽名:

顧客的任何支付都需要至少兩個簽名才能解鎖,一個來自Mohammed,另一個來自其合夥人或擁有備份鑰匙的代理人。這樣的多重簽名機制能爲公司治理提供管控便利,同時也能有效防範盜竊、挪用和遺失。帶來的問題就是腳本特別長。
2<Mohammeds PublicKey><Partner1 PublicKey><Partner2 PublicKey><Partner3 PublicKey><Attorney PublicKey>5 OP_CHECKMULTISIG \begin{array}{l} {\rm{2 < Mohammed's \space Public Key > < Partner1 \space Public Key > < Partner2 \space Public Key > }}\\ {\rm{ < Partner3 \space Public Key > < Attorney \space Public Key > 5 \space OP\_CHECKMULTISIG}} \end{array}
雖然多重簽名十分強大,但其使用起來還是多有不便。多重簽名導致過長的公鑰,使得腳本也不斷增加長度,那麼一個長的交易腳本將一直記錄在所有節點的隨機存儲器的UTXO集中1直到該筆資金被使用。所有這些都使得在實際交易中採用複雜輸出腳本顯得困難重重。

a.付款前必鬚髮送給
b.產生的腳本過長,保存在UXTO中
b.產生的腳本過長,保存在UXTO中
多重簽名
每一位客戶
1.使用產生腳本的比特幣錢包軟件
2.利用腳本來完成交易
3.多重簽名組合導致過長的公鑰
導致複雜腳本輸出處理困難

2.2 P2SH

P2SH就是爲了解決這一難題而誕生,同時它所使用得方法思想也一直在影響我們對簽名認證的處理,當一個簽名過程時,我們都會試圖通過對其進行hash處理,

在P2SH交易中,鎖定腳本由哈希取代,哈希指代的是贖回腳本。因爲它在系統中是在贖回時出現而不是以鎖定腳本模式出現。

2.2.1 使用P2SH與不使用對比

  1. 不含P2SH的複雜腳本

    Locking Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
    Unlocking Script Sig1 Sig2
  2. P2SH的複雜腳本

    Redeem Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
    Locking Script OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
    Unlocking Script Sig1 Sig2 redeem script

2.2.2 腳本支付

1. 鎖定腳本

一筆P2SH交易運用鎖定腳本將輸出與哈希關聯,而不是與前面特別長的腳本所關聯。使用的鎖定腳本爲:

OP_HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e OP_EQUALOP\_HASH160 \space 54c557e07dde5bb6cb791c7a540e0a4796f5e97e \space OP\_EQUAL

這個P2SH等同於“向含該哈希的腳本支付”

2. 支付過程

顧客在向Mohammed公司支付時,只需在其支付指令中納入這個非常簡短的鎖定腳本即可。當Mohammed想要花費這筆UTXO時,附上原始贖回腳本(與UTXO鎖定的哈希)和必要的解鎖簽名即可

指令中納入簡短的鎖定腳本
原始贖回腳本hash+必要解鎖簽名
顧客
Mohammed公司支付
花費顧客所給的交易

如:

<Sig1><Sig2><2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG><Sig1> <Sig2> <2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG>

兩個腳本經由兩步實現組合:

  1. 將贖回腳本與鎖定腳本比對以確認其與哈希是否匹配——進行hash匹配:<2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 <redeem scriptHash>OP_EQUAL<2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG> \space OP\_HASH160 \space <redeem \space scriptHash> OP\_EQUAL
  2. 假如贖回腳本與哈希匹配,解鎖腳本會被執行以釋放贖回腳本——匹配好了之後,釋放贖回腳本,將公鑰信息放出來:<Sig1> <Sig2> 2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG<Sig1> \space <Sig2> \space 2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG

3. 與比特幣地址一樣同樣的優勢——hash編譯爲地址

P2SH的另一重要特徵是它能將腳本哈希編譯爲一個地址,Mohammed可以將該地址發送給他的客戶,這些客戶可以採用任何的比特幣錢包實現簡單支付,就像這是一個比特幣地址一樣。只是這裏的地址能夠對應到一組公鑰也就是一個腳本

4. 優點

  1. 在交易輸出中,複雜腳本由簡短電子指紋取代,使得交易代碼變短(那麼對比時間就會大大減少,只是傳輸時間不變而已,因爲確認之後依舊要傳輸公鑰信息等)。
  2. 腳本能被編譯爲地址,支付指令的發出者和支付者的比特幣錢包不需要複雜工序就可以執行P2SH。
  3. P2SH將構建腳本的重擔轉移至接收方,而非發送方。
  4. P2SH將長腳本數據存儲的==負擔從輸出方(存儲於UTXO集,影響內存)轉移至輸入方(僅存儲於區塊鏈)==。
  5. P2SH將長腳本數據存儲的重擔從當前**(支付時)轉移至未來(花費時)**。
  6. P2SH將長腳本的交易費成本從發送方轉移至接收方,接收方在使用該筆資金時必須含有贖回腳本

參考文章:

1.UTXO交易模型

2.精通比特幣.第五章.第七節


  1. (Unspent Transaction Outputs)是未花費的交易輸出,它是比特幣交易生成及驗證的一個核心概念。交易構成了一組鏈式結構,所有合法的比特幣交易都可以追溯到前向一個或多個交易的輸出,這些鏈條的源頭都是挖礦獎勵,末尾則是當前未花費的交易輸出。 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章