智慧合約遷移的工作原理
智慧合約是很容易受到攻擊的——合約上存在的bug、使用者的錢包的漏洞、或者設定上的疏忽,都會導致被攻擊。如果您使用了智慧合約,則必須準備好應急預案,在大多數情況下,唯一有效的解決方案是部署新的智慧合約例項,並且將所有資料遷移到該例項中。
如果您計劃開發可升級的智慧合約,遷移過程將的最大風險是在升級機制的過程中。
本篇文章將帶你瞭解智慧合約遷移的工作原理。
您需要合約遷移功能
即使是沒有任何漏洞的智慧合約,使用者也可能會因為私鑰的丟失而被盜。在這類攻擊中,即使智慧合約具備了可升級的機制,也可能無法修復已部署的智慧合約,因此需要部署並正確初始化合約的新例項,以便為使用者恢復功能,所有開發人員必須在智慧合約設計階段就整合遷移功能,並且必須準備好折中方案進行遷移。
遷移有兩個步驟:
1)恢復要遷移的資料 2)將資料寫入新合約
接下來就讓我們來看看細節,成本和運營方面的後果。
如何執行遷移
第1步:資料恢復
需要從區塊鏈中的特定區塊來讀取資料,如果是從事件(黑客或故障)中恢復,需要在事件發生之前,使用阻止或過濾攻擊者的操作。
如果可能,先暫停合約,這對使用者更加透明,並防止了黑客攻擊不懂遷移的使用者。資料恢復將取決於您的資料結構:
對於簡單型別的公共變數(例如uint或address),通過getter的檢索值是微不足道的。對於私有變數,您可以依賴事件,也可以計算變數的記憶體偏移量,然後使用getStorageAt函式檢索。由於元素的數量是已知的,因此陣列也很容易恢復。
對映的情況就有點複雜了,不儲存對映的鍵,需要恢復它們才能訪問這些值。為簡化離線跟蹤,我們建議在對映中儲存值時發出事件。
對於ERC20智慧合約來說,可以通過跟蹤轉移事件的地址找到所有持有者的列表,這個過程很難。
我們準備了兩個方案來幫你:
首先,可以掃描區塊鏈並自行檢索持有者; 在第二種情況下,可以依賴乙太網區塊鏈公開的Google BigTable存檔。
如果您不熟悉web3 API以從區塊鏈中提取資訊,則可以使用ethereum-etl,它提供了一組指令碼來簡化資料提取。
如果您沒有同步區塊鏈,則可以使用Google BigQuery API。
圖1顯示瞭如何通過BigQuery收集給定令牌的所有地址:
BigQuery提供對塊編號的訪問,因此可以調整此查詢以將事務返回到特定塊。
一旦恢復了所有持有者的地址,就可以離線查詢balanceOf功能以恢復與每個持有者相關的餘額。過濾餘額為空的帳戶。
現在我們知道如何檢索要遷移的資料,我們就可以將資料寫入新合約。
第2步:資料寫入
收集資料後,就要建立新的智慧合約了。
對於簡單的變數,可以通過智慧合約的建構函式來設定值。
如果資料無法儲存在單箇中,則情況會稍微複雜和昂貴。每個交易都包含在一個區塊中,該區塊限制了其交易可以使用的gas總量(所謂的“Gas Limit”)。如果交易的gas成本接近或超過此限制,礦工將不會再打包。因此,如果要遷移大量資料,則必須將遷移拆分為多個任務。
解決方案是在智慧合約中新增初始化狀態,只有所有者才能更改狀態變數,使用者無法執行任何操作。
對於ERC20令牌,該過程將採取以下步驟:
1)在初始化狀態下部署契約, 2)遷移餘額, 3)將合約的狀態轉移到生產狀態。 4)初始化狀態可以使用Pausable功能和指示初始化狀態的布林值來實現。
為了降低成本,可以使用批量傳輸功能實現餘額的遷移,該功能允許您在單個事務中設定多個帳戶:
在遷移合約時,會出現兩個主要問題:
遷移成本和對交易所有什麼影響。
遷移成本
資料的恢復是在鏈外完成的,因此是免費的。Ethereum-etl可以在本地使用。谷歌的BigQuery API提供足夠的免費信用來支付其使用。
但是,傳送到網路的每個事務和新合約儲存的每個位元組都有成本。
使用圖2的batchTransfer功能,轉移200個賬戶的成本約為2.4M gas,平均gas價格(10 Gwei)的5.04美元(ETH以今天的價格計算)。粗略地說,遷移一個數據需要0.025美元
如果我們看看按市值排名的前五大ERC20代幣的持有人數:
交易所
部署新合約可能會對運營產生影響。對於基於token的合約來說,在遷移期間與交換機協作非常重要,以確保將列出新合約,並且將丟棄之前的合約。
幸運的是,前面的標識遷移事件,表明交流有可能進行合作。
智慧合約遷移與可升級智慧合約
可升級的合約有幾個缺點:
需要詳細的EVM和Solidity的專業知識,基於委託呼叫的代理要求開發人員掌握EVM和Solidity是必要的。
增加了複雜性和程式碼大小,合約更難審查,更有可能會有bug和安全問題。
增加了要處理的金鑰數量,合約將需要多個授權使用者(所有者,升級者)。授權使用者越多,攻擊面越大。
每筆交易的gas費用增加。合約變得比沒有升級機制的同一版本更具競爭力。
他們鼓勵在部署後解決問題。如果開發人員知道無法輕鬆更新合約,他們往往會更徹底地測試和審查合約。
它們減少了使用者對合約的信任。使用者需要信任合約的所有者,這會阻止真正分散的系統。
只有在存在強有力的論據時,合約才應具有可升級機制,例如:
合約需要經常更新。如果要定期修改合約,則定期遷移的成本可能高到足以證明可升級性機制的合理性。
合約要求固定地址。合約的遷移需要使用新地址,這可能會破壞與第三方的互動(例如與其他合約的互動)。
合約遷移實現了升級帶來的好處,但缺點很少。升級相對於遷移的主要優點是升級成本更低。然而,這種成本並不能證明所有的缺點。
建議
在合約部署之前準備遷移過程、使用事件來促進資料跟蹤。
如果要購買可升級版的合約,則還必須準備遷移程式,因為您的金鑰可能會受到損害,或者您的合約可能會遭受錯誤且不可逆轉的操縱。
智慧合約帶來了新的發展模式,它們的不可變性要求使用者重新思考他們構建應用程式的方式,並要求徹底的設計和開發過程。
*本文由Trailofbits團隊首發於blog,由獵豹區塊鏈安全團隊翻譯與編輯,轉載請註明來自FreeBuf.COM