所有語言
分享
2013至2014年間,Vitalik Buterin 發表了以太坊白皮書提出用區塊鏈儲存程序,用戶可以在節點上調用這些程序,通過這種方式,程序可以作為創建者的代理人自動執行交易而無需人的參与。這就是智能合約。Buterin 認為這種機制足以安全地進行程序化的交易。這是一個百億級的錯誤。僅2020一年,由於智能合約安全性的問題就導致價值900億元加密資產的蒸發。
在以太坊及大批模仿者中,每個智能合約都管理自己發行的代幣的賬本。也就是說,在這些區塊鏈上存在不止一個賬本。原生幣有一個賬本。每一種代幣又各有一個賬本。他們都是去中心分佈式賬本嗎?對於原生幣的賬本不存在爭議,對於代幣的賬本,我們需要考察一下什麼才是一個去中心。
所謂去中心指的是每個記賬者(礦工)獨立地決定各自所紀錄的賬本內容,而不是机械地複製他人的賬本。這種獨立性包括獨立地決定每一筆交易是否合法,從而是否紀錄該筆交易。只要網絡中造假者不佔優勢,就可以通過這種方式阻止非法交易成為區塊鏈網絡的共識,從而達到保護資產安全的目的。如果一個區塊鏈中的礦工不具有這種獨立決定每一筆交易是否合法的能力,那麼這個區塊鏈就不是去中心的,礦工們都必須依賴一个中心化的權威決定來決定每筆交易是否合法,因此所有賬本就是由一个中心來控制的,這个中心就可以任意決定資產的歸屬,區塊鏈就不能為用戶提供安全性保障。而根據以太坊的智能合約交易模式,智能合約代幣的賬本是由合約管理,而非礦工管理。而每個合約都是由單一的項目方發布,礦工雖然紀錄合約所產生的數據,但礦工並不理解這些數據,只能是合約要求礦工記什麼礦工就記什麼。這就是把所有礦工從記賬人變為記賬的筆,而指揮這些筆的人是合約的項目方。因此這些代幣的賬本不是去中心的,而是中心化的賬本。這是非常不安全的。
以太坊的智能合約甚至都不能稱為合約。沒錯,合約可以通過程序執行,但並不是每個程序的執行都是一個合約。一個程序的執行要構成合約還需要額外滿足一些條件。對於作為去中心化賬本的區塊鏈來說,很重要的一條就是交易必須經過驗證。正如中本聰所說的:不要信任,要驗證。這是區塊鏈的金科玉律,任何時候違反它必然導致安全性問題。但以太坊並不驗證智能合約的交易結果,而只是驗證智能合約的執行過程。在以太坊中,用戶調用智能合約時,節點會執行智能合約,只要智能合約成功返回,節點就認為交易合法並予以記錄。這種模式有什麼問題呢?畢竟智能合約調用是用戶發起的,難道不應該接受智能合約調用的結果嗎?這是以太坊的思維。
法律上,雙方意思一致才是合約。合約各方必需對各方的付出和獲得都達成一致,合約才能成立。那麼用戶在調用智能合約時,他同意的是什麼?是接受智能合約所產生的任何結果,還是合約發布者宣稱會產生的結果?絕大多數用戶都不是程序員,不可能知道程序會怎麼運行,顯然他們同意的是合約發布者宣稱會產生的結果。但是以太坊是不可能驗證智能合約的執行結果是否與用戶的預期(也就是合約發布者宣稱的結果)一致,因為以太坊節點根本就沒有這方面的信息。所以以太坊中所記錄的每一筆智能合約交易只是證明“智能合約產生了這樣的結果”,而不是“合約雙方同意這樣的結果”。混同這二者的後果是致命的。
更糟糕的是,以太坊將智能合約的交易結果作為合約的數據來儲存。即,用戶從智能合約那裡獲得的資產是記錄在智能合約自己的賬本中,而不是公共賬本中。以太坊節點本身不會驗證這些資產的轉移。這些資產的轉移是由智能合約處理和驗證的。用戶不能直接控制這些資產。是智能合約在控制它們。這簡直就是開門輯盜。所以結果就是以太坊用戶只能任憑智能合約處置,在智能合約面前沒有任何安全保障。既沒有交易安全,因為以太坊不能保證合約執行的結果符合用戶期望;也沒有價值儲存安全,因為智能合約可以不經用戶同意就轉走用戶資產。
因此我們看到以太坊自發布以來已經發生多起與智能合約有關的安全性事件。相比之下,比特幣從未發生過安全性事件。大家都認為智能合約的安全問題是開發者的錯誤和疏忽所導致,所以業內在規範智能合約開發流程,對於智能合約進行形式驗證,代碼安全性審計,開發安全的智能合約語言等方面作出了很大的努力。然而智能合約的安全問題從根本上說是自以太坊發布以來業界對於去中心合約的錯誤理解和由此而來的不當交易模式所導致。解決了這個問題就能杜絕迄今為止的大多數智能合約安全問題。而不解決這些問題,現今的各種努力終歸不能杜絕智能合約的安全隱患。