比特幣用戶將會享受到一種名為Taproot的技術
在不久的將來,比特幣用戶可能會享受到一種名為“Taproot”的技術。該技術最早由比特幣核心開發(fā)者兼Blockstream前CTO Gregory Maxwell提出,它將擴展比特幣的智能合約靈活性,同時提供更好隱私保護。在區(qū)塊鏈領域,即使是最復雜的智能合約,也很難跟常規(guī)區(qū)分開來。
盡管這是一項非常大的工程,但它不僅僅是理論,是能夠實現(xiàn)的。包括Pieter Wuille、Anthony Towns、Johnson Lau、Jonas Nick、Andrew Poelstra、Tim Ruffing、Rusty Russell以及Gregory Maxwell在內的幾位最高產的比特幣代碼貢獻者正在研究一種被稱為Schnorr簽名的方案,該方案還包含了Taproot,據(jù)悉,這些升級內容都會在下一次協(xié)議更新中呈現(xiàn)。
本文將介紹Taproot是什么以及它的工作原理。
P2SH
所有比特幣本質上都被“鎖定”在腳本中:區(qū)塊鏈中的交易中可以嵌入幾行代碼,定義在下一個交易中如何使用這些比特幣?;ㄙM這些比特幣的條件通常包括提供簽名來證明所有權。但是還可以設置其他一些條件,例如TImelocks(這部分比特幣只能在特定區(qū)塊高度或日期之后才能被使用)或mulTIsig(多重簽名,需要在一組私鑰中的多數(shù)私鑰提供簽名的情況下才能被使用)。
還可以混合和選擇設置不同的條件,創(chuàng)建類型復雜的智能合約。舉個例子,如果Alice和Bob都簽名、或者在一周后Alice單獨簽名、或者Bob單獨簽名同時提供一個密碼,就可以使用這些比特幣。滿足這三個條件中的任何一個,都是這部分比特幣的使用方式。
自2012年以來,一開始腳本 (條件) 通常是不公開可見的;只有這些比特幣的新主人知道如何使用它們。這是通過一種名為P2SH (向腳本哈希支付) 的技術實現(xiàn)的,最初只有腳本的哈希值被包含在區(qū)塊鏈中。這串看似隨機打亂的數(shù)字實際上包含著一部分比特幣。當所有者使用時,他會同時展示整個腳本以及腳本的“解決方案”。然后,任何人都可以使用初始哈希來檢查所提供的腳本是否確實是鎖定比特幣的原始腳本,并且可以立即得出滿足腳本的執(zhí)行結論。
然而,當比特幣被花掉時,目前必須表明所有滿足要求所需的條件——包括尚未滿足的條件。這有兩個主要的缺點。第一,數(shù)據(jù)量很大,尤其是條件很多的情況下。其次,這不利于隱私。所有人都可以知道這筆資金用了什么方式使用,例如,會揭露出使用了哪種錢包甚至更多的信息。
MAST
為解決這兩個缺點,開發(fā)者們提出了一種使用默克爾樹的解決方案:MAST(默克爾化抽象語法樹)。簡而言之,所有的資金使用條件都被單獨進行哈希處理(而不是組合成單個哈希值),并包含在一棵默克爾樹中,最終生成單個哈希值:默克爾根,以這個默克爾根來“鎖定”比特幣。
這么做的好處是,如果需要展示默克爾樹中的任何數(shù)據(jù),都可使用默克爾根和一些附加數(shù)據(jù)(默克爾路徑)來驗證特定數(shù)據(jù)是否被包含在默克爾樹中。其余的默克爾樹信息仍然是哈希密文狀態(tài)的。
有了MAST,意味著只需要揭示出特定的滿足條件。如果在上面的例子中,Alice在一周之后使用了這些資金,她只需要揭示這個條件(以及默克爾路徑)。沒人知道這筆錢具體是怎樣花的,可能是Alice和Bob一起花的,也可能是Bob一個人花的。這使得MAST比復雜的P2SH智能合約在數(shù)據(jù)處理上更有效率,同時還增加了隱私性。
然而,在使用 Schnorr簽名的情況下,Taproot可以做得更好:因為MAST結構可以隱藏在一筆交易當中。
Schnorr簽名
Schnorr簽名方案長期以來一直受到許多比特幣開發(fā)者的青睞,目前還在開發(fā)階段,它將會通過軟分叉協(xié)議升級進行部署。許多密碼學家都認為Schnorr簽名方案是這一領域中的最佳方案,因為其數(shù)學特性提供了很強的正確性,不僅不受延展性影響,而且驗證速度相對較快。
在比特幣領域,Schnorr簽名最顯著的優(yōu)點是其“線性數(shù)學”(linear math),它支持簽名聚合:同一筆交易中的多個簽名可以合并為一個簽名。類似的方法也可以應用于多簽交易。將公鑰和簽名組合到“閾值公鑰”和“閾值簽名”中,可以使多簽交易與常規(guī)交易變得無法區(qū)分。
這種簽名方案還有更多有趣的使用方式。例如,可以使用其他數(shù)據(jù)來“調整”私鑰和公鑰。舉一個簡化的例子,可以通過將私鑰及其對應的公鑰都乘以2來作為新的公私鑰。“私鑰x 2”和“公鑰x 2”仍然對應,“私鑰x 2”仍然可以對使用“公鑰x 2”驗證的信息進行簽名。任何不知道原始密鑰對被調整了的人,甚至都看不出有什么差異;這些調整過的密鑰看起來和其他的密鑰對是一樣的。
這就衍生出了TapRoot。
Taproot
Taproot基于一種有趣的認知:無論多么復雜,幾乎所有MAST結構都可以(或應該)包含一種條件:允許所有參與者就結果達成一致并一起簽署結算交易。在前面的例子中,如果Bob知道Alice可以在下周獨自動用所有資金,那么他最好現(xiàn)在就跟她一起簽字。 (在許多典型的智能合約設置中,如果他不這樣做,他甚至會受到懲罰。復雜性實際上只是為了讓每個人都誠實。)
Taproot類似于MAST,并且通常允許所有參與者可以合作來花費這筆資金,即“合作終止合約”。
而通過使用Schnorr簽名,它會變得非常有趣。
首先,合作終止合約將利用Schnorr簽名的閾值方法,讓它看起來像一筆普通交易。因此,所有參與者的公鑰會疊加生成“閾值公鑰”。與該閾值公鑰相對應的是,所有參與者簽名的組合——他們的“閾值簽名”——允許他們花費這些資金。
但他們唯一能做的就是把這筆資金當作一筆普通交易來使用——目前還沒有類似MAST的結構。這就是Schnorr簽名的另一個作用。
所有可選擇的資金使用方式(非合作結算)都會被合并到不同的腳本中。然后,對這個腳本進行哈希處理,并使用它來調整閾值公鑰。與前面示例中使用的“公鑰x 2”不同,這將產生“閾值公鑰x腳本”(尚在簡化當中)。當然,這個“閾值公鑰x腳本”對應于“閾值簽名x腳本”。
現(xiàn)在,如果資金是合作使用的,所有參與者都將他們的簽名組合成“閾值簽名”,并用腳本對其進行調整。產生的“閾值簽名x腳本”允許他們使用這筆資金。然而,重要的是,對于外人而言,所有的這些看起來仍然像一個普通的公鑰和一個常規(guī)的簽名,即一筆常規(guī)的交易。
只有在合作終止合約被證明是不可能的情況下,其他人才會知道這是閾值公鑰:它是經過調整的。
在這種情況下,原始閾值公鑰和腳本將會被展示出來(因為剩余參與者仍然希望能動用這筆資金)。這證明“閾值公鑰X腳本”是用這個特定腳本進行調整的。因此,就像P2SH中的哈希值一樣,這種調整向全世界證明了,如果滿足腳本中指定的其他條件,資金就應該是可花費的。
或者,與其用腳本調整閾值公鑰,倒不如用默克爾樹的根值來調整閾值公鑰,默克爾樹的根值包含所有不同的可以使用資金的條件:MAST結構。那么,要使用這些資金,只需要披露已經滿足的支出條件。
因此,Taproot能夠提供MAST的所有好處,而在正常情況下,沒有人會知道一筆常規(guī)交易背后隱藏了如此復雜的智能合約。