為什麼以太坊智能合約不可更改?
01-28
智能合約部署了就不能修改,為什麼,那不就需要在部署前就對代碼進行很詳細的debug嗎?The DAO事件就是代碼出現了問題。如果代碼出現問題,現在是怎麼解決的?就不用它了,新建一個么?這樣子調試也很麻煩吧
智能合約部署了就不能修改,並非技術上的原因。
在以太坊中,合約代碼存儲在account的code中,變數存儲在account的storage中。
只是沒有提供修改code的介面。
跟普通程序一樣,代碼段是只讀的,數據段是可寫的。
因為代碼一般都認為寫好了就不會修改。
當然想做的話也可以,就像有的普通的程序也需要hot fix一樣。
但難點不在這個功能本身,而是代碼變了之後,變數的布局都變了,怎麼對接原來的數據。
目前的一些解決方法:
1.可以做proxy合約,對外提供的地址是proxy合約。真正的合約地址以變數的形式放在proxy合約裡面。要升級合約,重新部署真正的合約,然後把新的地址更新到proxy合約就行了。
2.用ENS。其實思路是類似的。
因為現在所謂的「智能合約」其實就是傻瓜合約,其革命性意義也不在於如何如何地智能,而是用演算法來取代傳統的契約訂立方式,從而杜絕任何可能的人工干預(如欺詐)及不確定性(如違約、糾紛)讓合約結果變得更為清晰、可預測。甚至於,在the Dao事件發生前,還有這樣一句口號:Code is Law.所以智能合約有以下特性:不可更改性、無需信任和安全性。 那為什麼不可更改呢?因為智能合約是建基於區塊鏈之上的,而區塊鏈可以被視為一個依靠特定演算法在不可信的多方間維持同一賬本的分散式資料庫,它由帶有時間戳的鏈式結構所組成,在鏈上的每一個區塊都帶有全部的交易記錄(不考慮輕節點及分片技術),所以,既然智能合約已經作為一段程序被運行在網路上的所有節點上,又怎麼能輕易替代或修改呢?除非,所有的這些節點取得同步,而這是單靠合約發布者所無法達成的。 如果上述所說完全落實的話,當然是非常可怕的,那樣我們就不需要法律了,並且一旦合約生成相關事件就不可逆轉了。但問題在於,許多事物至今無法被量化為代碼,線下資產還很多被數字化,映射於現實的複雜智能合約更難以被創建。更為重要的是,代碼本身就是人寫的,也必定會出現bug,那這時人們還等待智能合約的最終裁決嗎?顯然,在涉及到巨大利益衝突時,人們就坐立不住了,這在the Dao事件中被詮釋地酣暢淋漓。 最終,人們怎麼來解決這一問題的呢?硬分叉!這是區塊鏈的專有術語,與軟分叉相對應,也即是一條鏈分為兩條鏈的技術「升級」方案(很多時候政治意味更強)。兩者間的簡單區別在於後者的升級不影響普通用戶的正常使用,向前兼容之前的全部數據歷史,而後者強制所有礦工及終端用戶選擇留在哪條鏈上:原有的鏈還是被抹去/修改一段歷史的鏈。顯然這會對用戶資產及其正常使用帶來影響,並且帶來身份同一性的問題,對用戶認知造成混淆。所以,這是一種極其帶有爭議性且耗費巨大的解決方案。 那麼,難道沒有別的出路了?也不是,因為當前區塊鏈及加密數字貨幣行業尚處於早期探索階段,所以各種技術方案正在被嘗試中,雖然還不太成熟。比如說,解決合約升級的問題,業界已提出一種被稱為「熱替換合約」的解決方案,其核心在於,通過在全網節點中取得共識,在指定的將來某一區塊將舊合約替代為新合約,從而解決原有合約技術漏洞的問題。
可以更改(取決於你的合約邏輯),是不能篡改
代碼出現問題,可以在雙方同意的情況下修改。如果bug足夠大,又產生了無法挽回的損失,可以說服VB再做一次分叉。
可以把以太坊理解成一個只能添加不能修改的鍵值資料庫,部署智能合約相當於向這個資料庫添加一個鍵值對,鍵就是合約地址,值就是合約代碼。由於前面所述的不可更改性,及時你發現合約代碼有問題,你也不能修改,唯一能做的是部署新合約,但是新合約對應新地址,新地址中的代碼是不能操作老合約賬戶中的以太和數據的。
傳統合約合同,只關聯交易雙方,也只有有限數量的雙方持有(當然也有第三方公正的情況),修改需要雙方達成一致即可。智能合約,實際上持有者在更多的、且不可控的節點上被持有和保全,理論上,修改需要在同一時間空間中所有合約持有節點共同完成。我們可以設想一種合約修改機制完成修改。我想它還在路上。
推薦閱讀:
※比特幣,萊特幣,以太坊,以太經典,BCC,Dash價格分析(37)
※酷站推薦 - okex.com - OKEX | 數字資產交易平台 | 比特幣 | 萊特幣
※從零開始搭建顯卡礦機
※數字貨幣如何賺錢
TAG:區塊鏈Blockchain | 以太坊 | 智能合約 |