作者:Shinpbo,Bitcoin Magazine;翻譯:金色財經cryptonaitive
害怕巫師(註:有能力使用魔法的人類)。不是那些巫師,這些才是真正的巫師。
ZeroSync是一個透過使用零知識證明來擴展比特幣的協會。近日ZeroSync開發者Robin Linus發布新的比特幣提案BitVM,BitVM為未來比特幣應用程式開發打開了非常有趣的大門。 BitVM可以啟用幾乎任意的計算,並利用該計算來強制執行比特幣鏈上的操作。
BitVM不需要對比特幣進行任何共識更改。訣竅在於將所有這些邏輯移至鏈下,如果對方聲稱不誠實的結果,能夠在鏈上挑戰計算的一些步驟。簡而言之,BitVM將以一種可執行的方式,即時地將任意的圖靈完備計算引入比特幣。
邏輯閘基礎知識
為了真正理解該提案背後的機制,我們需要了解一些有關計算的物理和邏輯基礎知識。
每個人都知道,電腦內部只是傳遞各個1和0來執行所有操作,但這是如何運作的呢?這意味著什麼?電腦中的每個晶片核心都由數百萬或數十億個邏輯閘組成。
這些小設備接收一個或兩個訊息位元(1或0)作為輸入,並對它們執行簡單的邏輯操作,以產生1或0的輸出,然後將其饋送到下一個邏輯閘中。
有許多不同類型的邏輯閘,有些只是接收一個位元並輸出相同的數字( buffer gate,緩衝閘門)。其他的接收一個位,並輸出與接收到的相反的值(NOT閘)。有些接收兩個位,並且當兩個輸入位都是1時輸出1,其他任何組合輸出0(AND閘)。最後,至少在下面的範例清單中,有一個閘接收兩個位,並在兩個輸入都是1時輸出0,並在所有其他位元組合上輸出1(NAND閘)。
NAND閘真值表
NAND閘的有趣之處在於你可以只使用NAND閘來建構任何其他類型的邏輯閘。它肯定不像只製作其他門的特殊版本那樣高效,但它能完成任務。因此,鑑於你可以用NAND閘建構任何邏輯閘,你可以用NAND閘建構任意計算的電路。
在比特幣上建立NAND門
現在,如何使用現有的比特幣腳本來建立一個NAND閘呢?用哈希鎖和另外兩個你可能不熟悉的操作碼:OP_BOOLAND和OP_NOT。
首先,讓我們看看哈希鎖。建立一個分支腳本(branching script),可以透過兩種方式之一花費,揭示哈希鎖A的preimage,或揭示哈希鎖B的preimage。路徑A會在堆疊上放置數字1,而路徑B會放置數字0。
這使你能夠透過提供哈希鎖的preimage來「解鎖」一個位,以用作我們正在建造的NAND閘的輸入。你只能使用其中一個完成腳本,而不能同時使用兩者,我們很快就會討論其中的原因。這個簡單的原語只是為了允許使用者一次承諾使用一個位於NAND閘腳本中。
現在回想一下NAND閘是什麼,它接收兩位並輸出一個。如果輸入位元都是1,則輸出必須為零。如果輸入位元是任何其他組合,則輸出為1。你可以使用上面的兩路徑雜湊鎖定技巧承諾兩個輸入,以及輸出,只需要一種驗證輸出是否正確的方法。這就是OP_BOOLAND和OP_NOT發揮作用的地方。
在選擇要指派為輸入的值和要驗證的輸出值之後,你可以利用一個巧妙的技巧。 OP_BOOLAND與NAND執行的操作正好相反,如果兩個輸入都是1,則輸出為1。其他所有情況輸出0。 OP_NOT取得輸入的任何值並將其反轉,1變為0,反之亦然。這使你可以在腳本堆疊上對兩個輸入值執行NAND操作。然後,使用OP_EQUALVERIFY驗證與雜湊鎖技巧中承諾的輸出相符的NAND操作的實際輸出。如果腳本在堆疊上建立的實際NAND操作輸出與使用者聲稱它將產生的輸出不匹配,則腳本將無法通過評估。
現在,你已經在比特幣腳本中實作了一個NAND閘,以一種實際上強制執行虛擬NAND閘的方式。
引入任意計算
那麼,既然現在可以在比特幣腳本中創建一個單獨的NAND門,那麼可以做什麼呢?你可以創建一個完整的tapleaf樹,覆蓋任意計算的每一步,就像實際的邏輯閘為製造電腦處理器一樣。
為了完成複雜的計算,人們將邏輯閘連續放在一起,這樣一旦將初始輸入送入第一個閘,每個閘的輸出就直接作為另一個閘的輸入。透過在門之間適當地綁定哈希鎖,我們在這裡完成了相同的事情。即,如果一個閘腳本在值C1或C2的輸出之間有一個選擇,那麼系列中的下一個閘門將在符合的輸入中使用相同的雜湊鎖定值。這樣,有人欺騙關於上一個門的結果的唯一方法是揭示另一個C哈希鎖。我們可以將其用於懲罰機制。
兩個使用者選擇他們想要參與的任何計算,並將其分解為僅使用NAND閘逐個進行計算的電路。然後,他們採用並對電路中的每個單獨閘進行編碼,每個電路步驟都有適當的雜湊鎖選擇,並將其編碼到可以鎖定單個UTXO的tapleaf樹中。有一個版本的樹是供試圖證明他們正確執行程式的使用者使用的,另一個版本是驗證程式是否正確執行的人所使用的。現在,他們要做的是預先簽署一系列用於在鏈上執行的挑戰和回應遊戲的交易。理想情況下,整個計算在鏈下運行並得到驗證,用戶透過共同花費資金將其結算到基於計算結果的適當人員。然而,如果證明者停止合作,驗證者可以在鏈上對其提出挑戰。
第一步是將資金加載到方案中。一個腳本路徑將允許證明者在時間鎖定後單方面主張資金。下一個腳本路徑將允許驗證者在可以展示當前門的任何輸入或輸出的可能值的兩個preimage的情況下立即索賠資金。下一個腳本路徑將允許驗證者強制證明者在鏈上執行任何特定的門合約(即在鏈下停止合作後的門)。該路徑要求驗證者發布另一個只有他們擁有的哈希鎖preimage,作為對證明者每個門挑戰的鎖。這保證了證明者只能執行該特定的門。驗證者對該路徑的預簽名交易將其花費到腳本中,該腳本具有以下腳本路徑:驗證者在時間鎖定後取走硬幣,或證明者執行門並將硬幣花費回到類似於第一個的腳本,證明者在時間鎖定後可以索賠資金,驗證者可以立即索賠資金,如果向任何單個哈希鎖對顯示兩個preimage,或者驗證者可以再次挑戰證明者。
這個方案只需進行幾輪就可以保證合約正確結算。要么驗證者用完預簽名交易以繼續挑戰證明者,因為證明者一直在展示每個門的正確執行,證明者會主張這筆資金;或者,證明者不回應挑戰,因為這會使他們受到懲罰,而驗證者會在時間鎖定後索賠資金;或者證明者在鏈上錯誤執行了一個門,驗證者立即索賠資金。理想情況下,一切都在鏈下發生,並且透過合作解決,但是如果合作失敗,那麼在鏈上進行幾輪後,除了正確結算合約之外,沒有其他結果。
未來之路
毫無疑問,這樣的提案將在未來的幾週內討論。
需要處理和產生的資料量是巨大的。我們正在討論葉子編號達數十億的tapleaf樹,並且至少有幾跳的預簽名交易以確保準確的結算。
鏈下資料管理成本絕對是巨大的。
另一個重要的限制是,這個方案只能與兩個參與者一起使用,一個扮演證明正確執行的角色,另一個扮演驗證正確執行的角色。
雖然未來的研究有可能找到將其推廣到更多參與者的方法,但至少我看不到完成這一點的明確途徑。而且,即使解決了這個特定的問題,我也看不到擺脫這是一種互動協議的方式,該協議要求在合作情況下所有參與者始終參與。
儘管如此,這確實是一個非常有趣的演示,展示瞭如何使用複雜的程式來強制對比特幣進行有條件的控制。在單一葉腳本中可以打包多少邏輯,或者使用不同的操作碼可以使整個方案更加高效,這方面肯定還有優化的空間。透過對基本操作和博弈理論平衡的簡單拆解,可以使用比特幣強制執行任意計算。
真的巫師來了。