無指令碼指令碼(Scriptless Scripts)定義
無指令碼指令碼是一種透過使用Schnorr簽名在鏈外執行智慧合約的方法。(文末有抽獎)
無指令碼指令碼的概念源於Mimblewimble,Mimblewimble是一種區塊鏈設計,除核心及其簽名外,不儲存永久資料。Mimblewimble的基本屬性包括隱私和擴充套件性,這兩者都需要實現無指令碼指令碼。
無指令碼指令碼的好處
無指令碼指令碼的好處是功能性、隱私性和效率。
功能性
關於功能,據說無指令碼指令碼增加了智慧合約的範圍和複雜性。當前,如在比特幣指令碼中一樣,限制源於網路已啟用的OP_CODES的數量。無指令碼指令碼將智慧合約的規範和執行從網路轉移到僅涉及智慧合約參與者的討論中。
隱私
關於隱私,將智慧合約的規範和執行從鏈上轉移到鏈外可以增加隱私。在鏈上時,智慧合約的許多細節都共享給整個網路。這些詳細資訊包括參與者的數量和地址,以及轉移的金額。透過將智慧合約放到鏈下,網路僅知道參與者同意已滿足其合約條款,並且所討論的交易是有效的。
效率
關於效率,無指令碼指令碼將需要驗證和鏈上儲存的資料量減至最少。透過將智慧合約移離鏈下,可以減少全節點的開銷,並降低使用者的交易費用。
無指令碼指令碼列表
在本文中,將介紹各種形式的指令碼,包括:
1. 同步無指令碼指令碼
2. 介面卡簽名
3. 零知識有條件⽀付
Schnorr簽名的角色
首先必須定義Schnorr簽名的基本原理。簽名者有一個私鑰x,隨機私鑰r.G是離散日誌硬組的生成器,r=rG是公共nonce,P=xG是公鑰。
然後可以將訊息m的簽名s計算為簡單的線性事務
於
所選行上的位置被視為數字簽名,即所有需要提交的所有資料的雜湊值。驗證方程式涉及方程式中每個項與G的乘積,並考慮了密碼假設(離散對數),其中G可以被乘而不能除,從而防止瞭解密。
橢圓曲線數字簽名演算法(ECDSA)簽名(在比特幣中使用)在x和r中不是線性的,因此用處不大。
Schnorr多重簽名多重簽名(multisig)具有產生簽名的多個參與者。每個參與者可能會產生一個單獨的簽名並將其連線起來,從而形成多重簽名。使用Schnorr簽名,一個人可以擁有一個公鑰,這是許多不同的人的公鑰的總和。生成的金鑰是一個簽名可以驗證的金鑰。multisig的公式包括所有分量的和;因此所有nonce和s值都導致multisig的公式。
因此可以看出,這些簽名本質上是無指令碼的指令碼。多個參與者的獨立公鑰共同形成一個單獨的金鑰和簽名,在釋出時,不會洩露所涉及參與者的數量或原始公鑰的詳細資訊。
介面卡簽名可以修改此multisig協議以生成介面卡簽名,該簽名用作所有無指令碼指令碼指令碼函式的構建塊。介面卡簽名不是作為帶有金鑰的訊息的完全有效的簽名,而是承諾同意釋出的簽名將揭示一個秘密。這個概念類似於原子交換。但是沒有實現指令碼。由於這是橢圓曲線密碼學,因此只有橢圓曲線點的標量乘法。幸運的是,類似於雜湊函式,橢圓曲線函式以一種方式起作用,因此可以簡單地共享橢圓曲線點(T),並且秘密將為其對應的私鑰。如果考慮雙方,而不是在multisig協議中提供他們的nonce R,則除R(即R+T)之外,還考慮併傳送一個盲因子,作為橢圓曲線點T。因此可以看出R不是盲的,而是被秘密值T所抵消。在這裡,Schnorr multisig構造被修改為第一方生成。
其中t是共享秘密,G是離散對數硬組的生成器,r是隨機nonce。使用此資訊,第二方生成
訊息m中包含要交換的代幣。第一方現在可以計算完整的簽名,這樣
然後,第一方計算介面卡簽名s'並將其釋出給第二方(以及其他正在偵聽的人)
第二方可以透過斷言s'G來驗證介面卡簽名s'
但是這不是有效的簽名,因為雜湊的隨機數點是R + T而不是R。第二方無法從中檢索到有效的簽名,需要求解ECDLP才能恢復s′+t,這實際上是不可能的。在第一方廣播s要求獲得訊息m中的代幣後,第二方可以從
以上是非常籠統的。但是也可以透過附加輔助證明來獲得介面卡簽名,該介面卡簽名將允許將輔助協議的正確移動轉換為有效簽名。
同步無指令碼指令碼原像(Preimages)以原子方式執行獨立事務是透過預映像實現的。如果兩個事務需要將preimage放在同一個雜湊中,那麼一旦一個事務被執行,preimage就會被公開,以便另一個也可以被公開。原子交換和閃電通道都是使用這種結構。兩個Schnorr簽名的區別果我們考慮兩個Schnorr簽名的區別:
可以透過將每個項乘以G並確認代數正確性,以與單個Schnorr簽名相似的方式驗證上述方程式:
必須注意的是,差異d正在被驗證,而不是Schnorr簽名本身。d用作兩個獨立Schnorr簽名之間的轉換金鑰。給定d和s或s′,可以計算另一個。所以擁有d使這兩個特徵原子化。此方案不會將兩個簽名連結起來,也不會損害它們的安全性。
對於原子事務,在設定階段,有人向對方提供值d,並將其斷言為正確的值。交易簽名後,可以對其進行調整以完成另一筆交易。實現了原子性,但只有擁有此d值的人才能使用。通常虧損的一方需要d值。
值為原子性提供了一個有趣的性質。它在簽名公開之前被共享,而簽名公開後又允許兩個事務成為原子事務。透過利用任何兩個Schnorr簽名的差異,一個人可以構造成績單,例如原子交換多重簽名合約。
這是Mimblewimble的一項關鍵功能,以前認為該功能無法支援原子交換或閃電通道。
帶有介面卡簽名的原子(跨鏈交換)示例
Alice在一個特定的區塊鏈上有一定數量的代幣;Bob在另一個區塊鏈上也有一定數量的代幣。Alice和Bob想進行原子能交換。然而兩個區塊鏈都不知道對方,也無法驗證對方的交易。
實現此目標的經典方法涉及使用區塊鏈的指令碼系統來提出雜湊原影象挑戰,然後在兩邊都顯示相同的原影象。Alice知道原像後,便將其拿走以拿走代幣。然後Bob將它從一個鏈條複製到另一條鏈條上以收取他的代幣。
使用介面卡簽名,同樣的結果可以透過簡單的方法實現。在本例中,Alice和Bob都在每個區塊鏈的兩個輸出中的兩個上投代幣。它們並行簽署multisig協議,然後Bob會使用相同的值T向Alice提供每一面的介面卡簽名。這意味著對於Bob來說,要拿代幣,他需要顯示t;為了讓Alice拿走她的代幣,她需要露出T。Bob然後替換其中一個簽名,併發布t,拿走他的代幣。Alice從區塊鏈上可見的最終簽名計算t,並使用它來顯示另一個簽名,將她的代幣給Alice。
因此可以看出實現了原子性。人們仍然可以交換資訊,但是現在區塊鏈上沒有明確的雜湊或原像。無需指令碼屬性即可實現隱私。
零知識有條件⽀付
零知識有條件支付(ZKCP)是一種交易協議。該協議允許買方以私密,可伸縮,安全且重要的是在不信任環境中的方式使用硬幣從賣方購買資訊。預期的資訊只有在付款時才能傳輸。買賣雙方無需相互信任或依賴第三方仲裁。
⽐特幣開發者 Greg Maxwell 早在 2011 年就在⽐特幣維基⽹站上提出了 「零知識有條件⽀付」(ZKCP)的構想。採用比特幣這個被 模擬 出來的第三方來充當 交易支付 中的可信第三方。由於比特幣網路是去中心化,因而這個第三方將會是一個 零信任第三方。
透過這個⽅案,買賣雙⽅可以透過 BTC 進⾏資料的交易,並且可以做到所謂的「原子交換」,賣家在收款的瞬間,買家拿到資料。這個原理其實⾮常簡單,下面來講述下整個過程:
主角
賣家:Alice
買家:Bob
第一步:Alice 將「資料」⽤⼀個「鑰匙」 加密,鎖在箱子裡面。
第二步:Alice 將箱子傳送給 Bob,Alice 還將附加⼀個「零知識證明」,證明兩個事實:(1)箱子可以用鑰匙開啟,(2) 鑰匙的雜湊等於一個值 「h」
第三步:Bob 檢查零知識證明,確認上述事實為真。然後 Bob 將零知識證明中的一部分撕下來作為「收貨收據」。這個收據上寫著鑰匙的雜湊,也就是「h」
第四步:Bob 建立⼀個智慧合約,鎖定 1BTC,寫⼊「h」。⽀付指令碼要求:凡是可以提供「h」的雜湊原象的⼈可以提⾛這枚 BTC
第五步:Alice 向智慧合約出示鑰匙
第六步:智慧合約檢查「鑰匙」是否和「收貨收據」匹配
第七步:如果智慧合約透過檢查,則它把 1BTC 付給 Alice,同時把鑰匙交給 Bob。
第八步:Bob 用「鑰匙」開啟「箱子」,取出資料。至此,雙方完成交易。
Mimblewimble的核心無指令碼指令碼
如前所述,Mimblewimble是一種區塊鏈設計。與比特幣類似,每個交易都有輸入和輸出。每個輸入和輸出都有一個機密的交易承諾。機密承諾有一個有趣的特性,在有效的平衡交易中,可以從輸出承諾中減去輸入,確保Pedersen值的所有值都平衡。考慮到這些輸入和輸出的差異,會得到事務中每個輸出和每個輸入的所有者的multisig金鑰。這稱為核心。
mimblewible塊將只具有由上述多餘值建立的新輸入、新輸出和簽名的列表。
由於值是同態加密的,節點可以驗證沒有代幣被建立或銷燬。
引用了zkPoD:區塊鏈,零知識證明與形式化驗證,實現無中介、零信任的公平交易--郭宇(安比實驗室創始人)