如果合約發送方想要有一種方法來更新智能合約代碼,以便賬戶資料和其他東西接通,可以有什麼辦法嗎?可以在不改變合約位址的情況下進行,還是總是需要新的位址?
是否存在
annex
機制,在不需要重寫的情況下向智能合約中添加一些新的功能? 問題解答
一旦合約已經部署在區塊鍊中,它就是最終版了并不能再被改變。當然,可以通過允許原始代碼改變某些參數,來做些改變。
更新合約的一種方法是使用版本控制系統。例如,你可以有一個入口通道合約,它将所有調用轉發到合同的最新版本,由可更新的位址參數定義。你還可以使用名稱系統資料庫,并将其更新為指向最近的合約版本。
另一種方法是将邏輯代碼放在庫中,然後使用CALLCODE特性,通過Solidity中的庫調用位于指定的、可更新的位址的代碼。這樣,使用者資料在版本之間仍然存在。但這也就限制了邏輯合約的ABI必須保持不變。
官方說法:
從Homestead release釋出開始,有一個
DELEGATECALL
操作碼。這基本上允許你向前調用一個單獨的合約,同時保持
msg.sender
和所有存儲。
例如,你可以擁有一個保持相同位址和存儲的合同,但将所有調用轉發到存儲在變量中的位址:
contract Relay {
address public currentVersion;
address public owner;
function Relay(address initAddr){
currentVersion = initAddr;
owner = msg.sender;
}
function update(address newAddress){
if(msg.sender != owner) throw;
currentVersion = newAddress;
}
function(){
if(!currentVersion.delegatecall(msg.data)) throw;
}
}
原文《以太坊常見問題和錯誤》中的:
http://cw.hubwiz.com/card/c/ethereum-FAQ/1/1/17/另外推薦幾個很受歡迎全網稀缺的互動教程: