跟大家一起學習區塊鏈技術系列之一 比特幣之簽名哈希類型

OP_CHECKSIG 從每個簽名中提取非棧參數,允許簽名者自己決定對交易的哪些部分進行簽名。雖然簽名是為了保護交易不被修改,但仍然給了簽名者選擇的權利,讓其他人可以修改交易。

簽名的各種選擇,我們稱之為簽名哈希類型。現在有三個基本的簽名哈希類型可以使用:

  • SIGHASH_ALL,默認對所有輸入和輸出簽名,保護除了簽名腳本之外的一切。

  • SIGHASH_NONE,對所有輸入簽名,如果沒有其他簽名者使用另外的簽名標誌保護輸出的話,就允許任何人對交易輸出進行修改。

  • SIGHASH_SINGLE,僅僅對一個輸出進行簽名,這個輸出和輸入是相對應的,也就是他們有相同的輸出索引號,確保別人不能修改交易中你的那部分,允許其他簽名者修改他們那部分。對應的輸出必須存在,不然的話就是對一個數值將被簽名,顯然是個安全問題。這個輸入和其他輸入都被包含在簽名裡。其他輸入的序列號沒有包含在簽名裡,可以被更新。

基本的類型遇到SIGHASH_ANYONECANPAY標識就可以被修改了,產生了三種混合類型:

  • SIGHASH_ALL | SIGHASH_ANYONECANPAY 對所有輸出和一個輸入簽名,允許其他人添加或刪除他們的輸入,所以任何人都可以捐贈自己的比特幣,但是不能修改數量,發給誰也不能修改。

  • SIGHASH_NONE | SIGHASH_ANYONECANPAY 對一個輸入簽名,允許任何人添加和刪除他們的輸入或輸出,所以誰要是拿到了這個輸入的拷貝,就可以任意揮霍了,有這好事嗎?

  • SIGHASH_SINGLE | SIGHASH_ANYONECANPAY 對一個輸入和對應的輸出簽名,允許任何人增加或刪除其他的輸入。

因為每一個輸入被簽名,多輸入的交易有多個簽名哈希類型對交易的不同部分進行簽名,比如,一個單輸入的交易簽名用的NONE,那麼礦工可以修改它的輸出然後加入到區塊中。換言之,如果一個兩輸入交易有一個輸入使用NONE簽名,另外一個輸入用的是ALL,那麼ALL簽名者可以決定比特幣發給誰,不必詢問NONE簽名者,沒有其他人可以修改這個交易。


分享到:


相關文章: