用於競爭性眾籌契約的比特幣腳本
我很好奇如何使用比特幣腳本複制http://whatbitcointhinks.com/的功能。功能是兩個慈善機構之間存在一種眾籌競爭。比賽有時間限制,所以到最後,籌集到最多資金的慈善機構將贏得所有資金。
這是該概念的螢幕截圖:
r/bitcoin 上提出瞭如何將其作為智能合約實現的問題,我提出了一個使用三個 p2sh 地址的方案。但回复詢問輸家是否可以通過在贏家之前領取資金來繞過限制:
> > 也許 A 面是一個 p2sh 地址,B 面是另一個 p2sh 地址,並且兩個腳本都將第三個 p2sh 地址指定為輸出,該地址是一種 1-of-2 多重簽名地址,每個慈善機構都持有兩個私鑰中的一個。確切地說,它不是多重簽名,因為額外的限制是 nLockTime,並且為了讓慈善機構 A 索取資金,A 方 p2sh 的輸入需要大於 B 方 p2sh 的輸入。 > > >
具體來說,假設 A 獲得 10 個 1BTC 捐款,B 獲得 9 個。是什麼阻止 B 使用所有 9 個 B 捐款和 10 個 A 捐款中的 8 個來廣播交易?
有沒有辦法在比特幣腳本中將其實現為類似眾籌的合約?
今天的基礎設施無法做到這一點。我們可以想像兩種解決方案。
第一個解決方案:比特幣升級
腳本通過新的操作碼逐漸變得更加強大。在這種情況下,我認為實際上必須有一個新的 UTXO 集索引(節點目前甚至不計算),以便腳本可以找到到特定地址/具有特定標記的所有付款並反映它們。然後,您可以讓人們使用虛擬碼中的腳本將錢投入輸出:
- 如果過了某個時間
- 執行 UTXO 查找以找到所有標記為用於甲方的輸出
- 對 B 方進行相同的查找
- 解析並總結它們以確定哪一個贏了。現有的指令集可能不夠好,也可能不夠好,但重新啟用很久以前被恐慌禁用的操作碼似乎並非不可能:只需要好的單元測試。
- 然後使用該計算的結果,要求由獲勝地址發起的簽名
所以腳本架構可以做到這一點,並重新啟用擴展和一些禁用的操作碼。但真正的問題是——應該嗎?
允許這種事情的主要缺點是計算所需的數據庫索引是計算密集型的,並且會減慢節點的速度,從而使它們的執行成本更高,並損害比特幣的擴展性。
好處是每個網路參與者都會對這種結構進行審計和驗證,這是比特幣中最好的安全性。
對於這個特定的案例,我可能會覺得成本大於收益。IMO 的結構相當奇怪且不引人注目。不過,也有可能有人提出了一個 OP_LOOKUP_OUTPUTS 的案例,這實際上是令人信服的,而且我們一直在談論讓節點在 UTXO 集上計算更多索引。如果我們最終出於其他原因這樣做,那麼通過腳本公開它似乎並不是一個很大的飛躍,並且將這種構造作為“純”智能合約成為可能(甚至很容易)。
第二種解決方案:預言機網路
自從比特幣誕生以來,關於腳本合約的簡單性和強大性之間的平衡一直存在爭議。比特幣具有相當嚴格的腳本語言,部分原因是在早期發現它沒有經過充分的測試並且對安全漏洞開放,而減少未使用的功率是穩定核心的快速方法。
乙太坊正好相反,它賦予腳本強大的功能和訪問大量昂貴功能的權限,例如數據儲存槽。它的安全性如何,對 DoS 攻擊的抵抗力如何等等目前是一個懸而未決的問題,但我們從比特幣、Java、Flash、HTML/JS 等的痛苦經驗中知道,沙盒移動程式碼非常困難。他們會為他們完成他們的工作。我所知道的所有移動程式碼沙箱都在某個時候被發現存在漏洞,因此沒有人能夠**做到乙太坊想要做的事情而不會反復出現漏洞。這就是為什麼比特幣社區對增加 Script 的力量如此保守的原因。
如果我們能夠以某種方式創建兩個腳本系統,一個是管理核心網路中資金流動的簡單/瑣碎的腳本系統,以及一個更強大的腳本系統,其中安全漏洞只影響使用這些功能的人而不是每個人,那將是理想的。
我們可以通過幾種方式在比特幣中做到這一點。
一種是擁有一個獨立的 p2p 預言機網路:
<https://en.bitcoin.it/wiki/Contracts#Trust_minimization:_multiple_independent_oracles>
在這種情況下,每個預言機都有一個身份,人們支付預選預言機的門檻值簽名。每個預言機獨立執行程序,如果程序成功,則使用他們的私鑰簽名。
這裡的問題是你沒有太多的敏捷性。預言機不能像礦工那樣來來去去。
另一種是在這種技術可用時使用側鏈。在這種情況下,側鏈不包含任何硬幣,不需要雙向掛鉤。相反,側鏈“事務”只是斷言程序已執行並得到滿足。然後預言機“探勘”側鏈,從而證明大多數算力執行腳本並獲得預期的輸出。
最後一種方法是在此類技術可用時使用 SNARK。
以這種方式對事物進行沙盒處理的吸引力在於,例如,如果在占主導地位的預言機實現中發現了沙箱逃逸漏洞,它將導致預言機鎖定的輸出變得可竊取,但任何其他比特幣輸出都無法竊取,因此風險是可控的。
相比之下,乙太坊設計將事物更緊密地結合在一起。乙太坊合約引擎中的漏洞可能會導致整個系統崩潰。