是誰控制了比特幣,是你?還是錢包?BTC地址與交易原理大剖析

首先入棧的是 ,然後將 入棧,一次DUP操作將在棧頂複製一份 ,HASH160彈出棧頂的 並計算Hash,將結果壓回棧中,之後使用 EQUALVERIFY 彈出Hash對比是否合相等,如果相等則返回True,不相等便標記交易為無效。執行到這一步,暴露了公鑰,確保了簽名者的身份的正確性,但是黑客或礦工可以通過暴露的公鑰構造出一個新的交易替換原始交易,無法保證安全,那麼便需要下一步來保證交易無法偽造。此時棧上還有 和 ,執行 CHECKSIG,將校驗數字簽名的正確性,確保了簽名者擁有地址對應的私鑰。

數字簽名除了持有私鑰的人,誰也無法偽造,執行至此,一筆比特幣P2PKH交易已經安全地完成了。

再解釋一遍:當 Bob 要花費 Alice 給他的比特幣時,Bob 只有用正確的鑰匙才能打開 Alice 留給他的保險箱,把錢放入 Bob 新構造的一個保險箱裡。

這時候一些聰明的讀者會注意到一個細節:如果 Bob 取出鑰匙,在還未打開保險箱的時刻,區塊鏈上的任何礦工都能看得見這把鑰匙的形狀,理論上他們是可以立即複製一把鑰匙,把 Alice 留給 Bob 的保險箱打開並花掉(俗稱 Front-running 攻擊)。真的可以這樣做嗎?顯然中本聰考慮了這個問題,這把鑰匙中的交易簽名是 Bob 發起的交易的完整簽名。假設 Bob 要將 Alice 構造的保險箱中的比特幣裝入一個新的保險箱(留給Charlie),這時候 Bob 出示的鑰匙包含了 Charlie 的公鑰Hash,礦工雖然可以複製 Bob 的鑰匙,但是這把鑰匙已經隱藏了下一個新保險箱的關鍵信息,因此礦工無法使用這個複製鑰匙來完成別的動作(無法挪用數字簽名)。

P2SH——後中本聰時代的重大創新

中本聰設計了一個這麼強大的腳本系統,只用來構造轉賬交易似乎太浪費了,我們試試用其他指令構造一些特別的鎖定腳本,並使用其他方式來解鎖。

例如我們可以構造一個用 Hash 原象(Pre-image)來解鎖交易的腳本:

OP_HASH160

OP_EQUAL

這個腳本的含義是:當滿足 Hash160(Pre-image)==這個條件時,便可成功將腳本解鎖。

我們繼續通過保險箱的例子來解釋,並給這類保險箱起名為 3-類保險箱。現在 Alice 給 Bob 的比特幣鎖定在一個由上述 Hash160保護的保險箱裡,我們姑且稱之為哈希鎖吧。

這把鎖依然需要正確的形狀才能開啟,但是安全性卻弱很多,缺少數字簽名機制導致鑰匙隱藏的關鍵信息不會隨著Bob 新建的保險箱而變化。任何礦工都能在 Bob 亮出鑰匙的一瞬間複製出一摸一樣的鑰匙,搶著去開Alice留給Bob的保險箱(Front-running),將幣轉給另一個人 Eve,於是原本屬於 Bob 的比特幣會被洗劫一空。

雖然這個腳本非常不安全,但是它卻有兩個非常神奇的功能:

1. 交易構造的輸出足夠短,意味著比特幣節點維護的 UTXO 緩存佔用空間將會大大減小

2. Pre-image 總是在交易被花費時作為 input 來引用,不會在交易的 output 側出現,UTXO依然保持精簡,同時可以把手續費負擔轉嫁給接收方。

既然所述的輸出腳本好處很多,那我們是否有辦法讓這種交易方式變得安全呢?這就需要講講什麼是 P2SH了。

比特幣核心開發者 Gavin Adresen 提出了一種叫做 Pay to Script Hash (P2SH) 的技術。

P2SH 的交易輸出依然是判斷 Hash160(Script)==


分享到:


相關文章: