智慧合約遷移的工作原理

買賣虛擬貨幣
導讀:智慧合約是很容易受到攻擊的——合約上存在的bug、使用者的錢包的漏洞、或者設定上的疏忽,都會導致被攻擊。如果您使用了智慧合約,則必須準備好應急預案,在大多數情況下,唯一有效的解決方案是部署新的智慧合約例項,並且將所有資料遷移到該例項中。如果你計劃開發可升級的智慧合約,遷移過程將的最大風險是在升級機制的過程中。本篇文章將帶你瞭解智慧合約遷移的工作原理。*本文由Trailofbits團隊首發於blog,由獵豹區塊鏈安全團隊翻譯與編輯*(譯文連結:https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/)1. 你需要智慧合約遷移
即使是沒有任何漏洞的智慧合約,使用者也可能會因為私鑰的丟失而被盜。在這類攻擊中,即使智慧合約具備了可升級的機制,也可能無法修復已部署的智慧合約,因此需要部署並正確初始化合約的新例項,以便為使用者恢復功能,所有開發人員必須在智慧合約設計階段就整合遷移功能,並且必須準備好折中方案進行遷移。遷移有兩個步驟:1)恢復要遷移的資料2)將資料寫入新合約讓我們來看看細節、成本和運營後果。2.如何執行遷移
第1步:資料恢復需要從中的特定區塊來讀取資料,如果是從事件(駭客或故障)中恢復,需要在事件發生之前,使用阻止或過濾攻擊者的操作。如果可能,先暫停合同,這對使用者更加透明,並防止了駭客攻擊不懂遷移的使用者。資料恢復將取決於您的資料結構:對於簡單型別的公共變數(例如uint或address),透過getter的檢索值是微不足道的。對於私有變數,您可以依賴事件,也可以計算變數的記憶體偏移量,然後使用getStorageAt函式檢索。由於元素的數量是已知的,因此陣列也很容易恢復。
對映的情況就有點複雜了,不儲存對映的鍵,需要恢復它們才能訪問這些值。為簡化離線跟蹤,我們建議在對映中儲存值時發出事件。對於ERC20智慧合約來說,可以透過跟蹤轉移事件的地址找到所有持有者的列表,這個過程很難。我們準備了兩個方案來幫你:首先,可以掃描區塊鏈並自行檢索持有者; 在第二種情況下,可以依賴乙太網區塊鏈公開的Google BigTable存檔。如果您不熟悉web3 API以從區塊鏈中提取資訊,則可以使用ethereum-etl,它提供了一組指令碼來簡化資料提取。

如果您沒有同步區塊鏈,則可以使用Google BigQuery API。圖1顯示瞭如何透過BigQuery收集給定令牌的所有地址:


圖1:使用Google BigQuery恢復地址0x41424344處令牌的所有Transfer事件
BigQuery提供對塊編號的訪問,因此可以調整此查詢以將事務返回到特定塊。一旦恢復了所有持有者的地址,就可以離線查詢balanceOf功能以恢復與每個持有者相關的餘額。過濾餘額為空的帳戶。現在我們知道如何檢索要遷移的資料,我們就可以將資料寫入新合約。
第2步:資料寫入收集資料後,就要建立新的智慧合約了。對於簡單的變數,可以透過智慧合約的建構函式來設定值。如果資料無法儲存在單箇中,則情況會稍微複雜和昂貴。每個交易都包含在一個區塊中,該區塊限制了其交易可以使用的gas總量(所謂的“Gas Limit”)。如果交易的gas成本接近或超過此限制,礦工將不會再打包。因此,如果要遷移大量資料,則必須將遷移拆分為多個任務。解決方案是在智慧合約中新增初始化狀態,只有所有者才能更改狀態變數,使用者無法執行任何操作。
對於ERC20令牌,該過程將採取以下步驟:1)在初始化狀態下部署契約,2)遷移餘額,3)將合約的狀態轉移到生產狀態。4)初始化狀態可以使用Pausable功能和指示初始化狀態的布林值來實現。為了降低成本,可以使用批次傳輸功能實現餘額的遷移,該功能允許您在單個事務中設定多個帳戶:


在遷移合約時,會出現兩個主要問題:
遷移成本和對交易所有什麼影響。

3.遷移成本

資料的恢復是在鏈外完成的,因此是免費的。Ethereum-etl可以在本地使用。谷歌的BigQuery API提供足夠的免費信用來支付其使用。

但是,傳送到網路的每個事務和新合同儲存的每個位元組都有成本。

使用圖2的batchTransfer功能,轉移200個賬戶的成本約為2.4M gas,平均gas價格(10 Gwei)的5.04美元(ETH以今天的價格計算)。粗略地說,遷移一個資料需要0.025美元。

如果我們看看按市值排名的前五大ERC20代幣的持有人數:


4.交易所

部署新合約可能會對運營產生影響。對於基於token的合同來說,在遷移期間與交換機協作非常重要,以確保將列出新合約,並且將丟棄之前的合約。

幸運的是,前面的標識遷移事件,表明交流有可能進行合作。

智慧合約遷移與可升級智慧合約

可升級的合約有幾個缺點:

· 需要詳細的EVM和Solidity的專業知識,基於委託呼叫的代理要求開發人員掌握EVM和Solidity是必要的。
· 增·加了複雜性和程式碼大小,合約更難審查,更有可能會有bug和安全問題。
· 增加了要處理的金鑰數量,合約將需要多個授權使用者(所有者,升級者)。授權使用者越多,攻擊面越大。
· 每筆交易的gas費用增加。合約變得比沒有升級機制的同一版本更具競爭力。
· 他們鼓勵在部署後解決問題。如果開發人員知道無法輕鬆更新合同,他們往往會更徹底地測試和審查合約。
· 它們減少了使用者對合約的信任。使用者需要信任合約的所有者,這會阻止真正分散的系統。
· 只有在存在強有力的論據時,合約才應具有可升級機制,例如:
· 合約需要經常更新。如果要定期修改合約,則定期遷移的成本可能高到足以證明可升級性機制的合理性。
· 合約要求固定地址。合約的遷移需要使用新地址,這可能會破壞與第三方的互動(例如與其他合同的互動)。
· 合約遷移實現了升級帶來的好處,但缺點很少。升級相對於遷移的主要優點是升級成本更低。然而,這種成本並不能證明所有的缺點。

5.小貼士

在合同部署之前準備遷移過程、使用事件來促進資料跟蹤。

如果要購買可升級版的合約,則還必須準備遷移程式,因為您的金鑰可能會受到損害,或者您的合約可能會遭受錯誤且不可逆轉的操縱。

智慧合約帶來了新的發展模式,它們的不可變性要求使用者重新思考他們構建應用程式的方式,並要求徹底的設計和開發過程。


更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;