但是由 Blockstream 的數學家 Andrew Poelstra 帶頭研究的最近一個話題可以幫助解決這個問題。 最近他在 “ Scaling Bitcoin Stanford” 演講中提及的關鍵內容,“無指令碼指令碼”有可能將某些智慧合約完全從比特幣區塊鏈中移除 - 同時仍然保證比特幣的所有安全性。
比特幣和智慧合約
在20世紀90年代,數字貨幣大佬 Nick Szabo 首次提出的智慧合約基本上是自動執行合約。 最典型的是,如果滿足特定的條件,他們會把錢從某人那裡匯給某人。 例如,如果有人在播放一首歌曲,這筆錢則會從流媒體機構自動支付給藝術家。
雖然智慧合約通常與以太坊等 “第二代” 區塊鏈有關,但比特幣也一直支援基本的智慧合約。 從某種意義上說,任何比特幣交易在技術上都是一個 “聰明” 的合同:只要提供有效的加密簽名,資金通常就會在該條件下移動。 稍微更先進的智慧合約(如多重資料和時間鎖定)可用於啟用 Lightning Network 等第二層協議。
但基於區塊鏈的智慧合約是存在問題的。 首先,這個過程變得越來越複雜,需要更多的資源來執行。 這就存在很大的問題,因為這要求網路上的所有節點都需要執行合同 - 而不僅僅是參與合同的各方。
整個網路的執行也意味著,整個網路將確切的知道我的智慧合約,完全沒有什麼祕密可言。 此外,這對於可互換性也是不利的。 如果智慧合約由於某種原因而不受歡迎,所涉及的資金(在區塊鏈上公開可見)就會受到破壞。
隨著智慧合約變得越來越複雜,甚至可能成為安全風險。 例如,替代軟體的實現可能會使合同的細節略微不同,使網路上的所有節點達成一致變得困難起來。 這些智慧合約中的潛在缺陷也是公開的,這就給黑客以可乘之機。
但是 Poelstra 等人認為,這些問題中的許多問題都可以通過將大量合同移出區塊鏈來解決。 只有合約涉及的各方才能執行這個功能,而不是讓網路上的所有節點都計算出整個智慧合約。
問題的關鍵就在於確保網路的其他部分仍然能夠正確執行合同的結果:只有滿足所需條件,才能進行支付。
Schnorr 簽名
Poelstra 最初開始在 Mimblewimble 協議的背景下研究 “Scriptless Scripts”(他自己創造的一個短語)。 比特幣的精簡版本提供了更多的隱私和更好的可擴充套件性,但不支援指令碼:在比特幣交易中的程式碼位允許最基本的智慧合約功能。
所以,Poelstra 想出瞭如何獲得指令碼所提供的實用程式,而不需要在區塊鏈上使用指令碼:Scriptless Scripts
。
Scriptless Scripts
的關鍵在於規則的加密簽名可以間接地揭示不屬於包含簽名的事務的一部分。 換句話說,當有人簽署驗證一個普通的比特幣交易時,它認為一個沒有託管在區塊鏈上的智慧合約仍然忠實地執行。
這就使得 Schnorr 簽名成為可能。 這些型別的簽名還沒有在比特幣協議上實現,但是從現在開始的一年左右就可能部署。
Schnorr 簽名允許的簽名:幾個簽名可以在數學上組合成一個簽名。 而且,對於這個用例來說重要的是,這個數學是“線性的”。這基本上意味著可以對這些簽名執行相對直接但非常有表現力的數學運算。
簡化之後,它的作用就像這樣:
當然,私鑰和簽名實際上只是數字,後者來自前者。 我們舉個簡單的例子來輔助理解,假設一個私鑰是 10,從該私鑰匯出的 Schnorr 簽名的前半部分為 10000. 另一個私鑰是 15,Schnorr 簽名的後半部分為 15000. 在這個例子中,Schnorr 簽名就是 25000(或10000 + 15000)。發現了沒有,所謂 Schnorr 簽名就是由兩個人的私鑰生成的 Schnorr 簽名的兩部分之和(有點繞)。
而且由於簽名的兩半隻是數字,所以可以在它們之間進行數學運算。 例如,在這個簡化的例子中,這兩半之間的差異是5000(或15000-10000)。
當然實際比這複雜的多,但是 Schnorr 簽名線性的特性允許有幾種這樣的數學“技巧”。
智慧合約
舉個例子:一個人(小明)想聽一位藝術家(貝多芬)的第七交響曲。 毫無疑問,貝多芬是這首歌曲的所有者,如果(並且只有)貝多芬的簽名被提供給託管該歌曲的伺服器,伺服器才能夠播放這首歌。假設這個“歌曲簽名”是7000. 那麼小明就可以通過支付給貝多芬一個比特幣的歌曲簽名聽歌曲。(他非常想聽這首歌。)
在這個簡單的例子中,小明和貝多芬可以通過做兩件事來使這個交易自動執行。 首先,他們建立了一個相當普通的比特幣交易,如果小明和貝多芬都提供一半的 Schnorr 簽名來建立一個完整的 Schnorr 簽名,則從小明向貝多芬傳送一個比特幣。 (這一步需要一些額外的安全措施,以確保沒有人破壞這筆交易)
下一步有點複雜。
現在,貝多芬知道小明一半 Schnorr 簽名的內容; 假設為 8000. 貝多芬當然知道自己的歌曲簽名是什麼樣的,比如是:7000. 因此,貝多芬很容易可以計算出這兩者之間的差異為:1000. 這就是所謂的介面卡簽名。 然後,貝多芬把這個介面卡簽名 - 1000 - 交給小明。
下面就是密碼學的用處所在。
通過修改普通的簽名驗證方法,小明即使不能訪問任何一個簽名,但同樣可以驗證他剛接收到的介面卡簽名(1000)的確是貝多芬的 半Schnorr簽名和她的歌曲簽名之間的差異。
現在,在驗證介面卡簽名(1000)檢驗出來之後,小明可以將其一半的Schnorr 簽名給予貝多芬,因為一旦貝多芬使用小明的一半簽名來建立完整的簽名並廣播到比特幣網路中,那麼,貝多芬同時也就自動將她的一半Schnorr簽名(8000)也顯示給小明。
使用貝多芬的 Schnorr 簽名的一半,小明現在可以減去自適應簽名:1000. 通過從貝多芬的半Schnorr簽名(8000-1000)減去自適應簽名,這時小明就獲得了貝多芬的“歌曲簽名”:7000。OK, 現在他可以聽這首歌了。
換句話說,通過廣播支付貝多芬一個比特幣的交易,貝多芬自動地將這個簽名賣給了這個小明。
總結
從區塊鏈的角度來看,交易是相當規範的。 除了“結算交易”之外,智慧合約的任何內容都不會記錄在區塊鏈上。 沒有人會知道一個潛在的合同被執行 ,合同相關的資料也不需要由有關各方以外的任何人計算或儲存。
引用
原文連結:Scriptless Scripts
轉自:無指令碼的指令碼:比特幣如何支援沒有智慧合約的智慧合約
本文由 Copernicus 團隊 冉小龍
翻譯,轉載無需授權。