一如何實(shí)現(xiàn)智能合約的遷移

雖然相比其他互聯(lián)網(wǎng)技術(shù)袭厂,智能合約等區(qū)塊鏈技術(shù)相對安全,但是并非絕對安全球匕,即使是零漏洞的合約也有可能被竊取的私鑰劫持纹磺。先前的Bancor 和KICKICO黑客事件表明:攻擊者可以損害智能合約錢包。在這些攻擊中亮曹,即使合約具備可升級性機(jī)制橄杨,也可能無法修復(fù)已部署的智能合約。唯一的解決辦法是重新部署并正確初始化新的合約實(shí)例乾忱,以便為用戶恢復(fù)功能讥珍。

  因此历极,所有智能合約開發(fā)者必須在合約設(shè)計(jì)階段整合一個(gè)遷移程序窄瘟。此外,企業(yè)必須做好在合約損害事件發(fā)生時(shí)實(shí)施遷移的準(zhǔn)備趟卸。

  遷移過程有兩個(gè)步驟:

  1蹄葱、恢復(fù)要遷移的數(shù)據(jù)

  2、將數(shù)據(jù)寫入新合約

  具體操作如下:

第一步:數(shù)據(jù)恢復(fù)

你需要從區(qū)塊鏈的某個(gè)特定區(qū)塊中讀取數(shù)據(jù)锄列。要想從損害事件(黑客攻擊或故障)中恢復(fù)數(shù)據(jù)图云,你需要在事件發(fā)生之前使用這個(gè)區(qū)塊,或者過濾攻擊者的操作邻邮。

  如果可以的話竣况,請暫停合約。這對于用戶來說更加透明公平筒严,并能阻止攻擊者盯上那些對遷移不知情的用戶丹泉。

  數(shù)據(jù)恢復(fù)的具體操作取決于你的數(shù)據(jù)結(jié)構(gòu)。

對于簡單類型的公共變量(public variables鸭蛙,例如 uint 或 address)來說摹恨,通過它們的getter來檢索特定值就可以了。而對于私有變量(private variables)娶视,你可以依賴事件晒哄,也可以計(jì)算變量的內(nèi)存偏移量,然后使用 getStorageAt[4]函數(shù)檢索它的值肪获。

  由于元素的數(shù)量是已知的寝凌,因此數(shù)組也很容易恢復(fù)。

至于映射(mappings)的話孝赫,情況有點(diǎn)復(fù)雜较木。由于鍵(Keys)在映射過程中不會被存儲,所以你需要將它們進(jìn)行恢復(fù)才能訪問對應(yīng)的值(Values)寒锚。為了簡化鏈下追蹤的過程劫映,我們建議在值被存儲在映射中時(shí)觸發(fā)事件(emit

  events)违孝。

  在ERC20代幣合約中,你可以通過追蹤代幣的Transfer事件的地址來獲取代幣持有者列表泳赋。這個(gè)過程很難雌桑。

對此,我們準(zhǔn)備了兩個(gè)幫助方案:第一祖今,你可以掃描區(qū)塊鏈并自行檢索持有者校坑;第二,你可以依靠以太坊區(qū)塊鏈的公開Goog

  BigTable存檔千诬。

  如果你不熟悉web3 API耍目,無法從區(qū)塊鏈中提取信息。那么你可以使用ethereum-etl 徐绑,其提供了一系列腳本來簡化數(shù)據(jù)提取的過程邪驮。

  如果你沒有已經(jīng)完成同步的區(qū)塊鏈,那么你可以使用Google BigQuery

  API傲茄。圖1展示了如何通過BigQuery來收集某個(gè)特定代幣的所有地址:


  圖1:利用Google BigQuery來恢復(fù)那些與在0x41424344這個(gè)地址中的代幣相關(guān)聯(lián)的Transfer事件的所有地址

  BigQuery提供對區(qū)塊號的訪問毅访,因此你可以將查詢結(jié)果調(diào)整為返回特定區(qū)塊的交易。

  一旦你恢復(fù)了所有代幣持有者的地址盘榨,你就可以離線查詢balanceOf函數(shù) 以恢復(fù)與每個(gè)持有者相關(guān)的余額喻粹,同時(shí)過濾余額為零的帳戶。

  現(xiàn)在我們知道如何檢索將要遷移的數(shù)據(jù)草巡,接下來我們要將數(shù)據(jù)寫入新合約守呜。

第二步:數(shù)據(jù)寫入

  完成數(shù)據(jù)收集后,你需要開啟新合約山憨。

  對于簡單變量查乒,你可以通過合約的構(gòu)造函數(shù)來設(shè)置相應(yīng)的值。

  如果你的數(shù)據(jù)無法保存在單筆交易中萍歉,那么情況會有點(diǎn)復(fù)雜侣颂,成本也會略高。每筆交易都包含在某個(gè)區(qū)塊中枪孩,該區(qū)塊限制了其交易可以使用的gas總量(即所謂的

  GasLimit)憔晒。如果某筆交易的 gas

  成本接近或超過此限制,那么礦工將不會將其打包進(jìn)該區(qū)塊內(nèi)蔑舞。因此拒担,如果想要遷移大量數(shù)據(jù),那么你必須將數(shù)據(jù)遷移拆分成多筆交易攻询。

這類情況的解決方案是:在合約中添加初始化狀態(tài)从撼,只有合約擁有者才能更改狀態(tài)變量,并且用戶無法執(zhí)行任何操作钧栖。

  對于ERC20代幣低零,上述過程將需要以下步驟:

  1婆翔、在初始化狀態(tài)下部署合約,

  2掏婶、遷移余額啃奴,

  3、將合約的狀態(tài)移至生產(chǎn)狀態(tài)雄妥。

  初始化狀態(tài)可以通過使用OpenZeppelin提供的 Pausable 功能和指示初始化狀態(tài)的布爾值(boolean)來實(shí)現(xiàn)最蕾。

  為了降低成本,我們可以使用batchTransfer(批量傳輸)函數(shù)(該函數(shù)允許你在單筆交易中設(shè)置多個(gè)帳戶)來實(shí)現(xiàn)余額的遷移:


  圖2:batchTransfer 函數(shù)示例

建議

  在合約部署之前做好遷移程序的功課老厌。

  使用事件(events)來提高數(shù)據(jù)追蹤的效率瘟则。

  如果你想要部署可升級合約,那么你必須準(zhǔn)備好遷移程序枝秤,因?yàn)槟愕拿荑€可能會受到損害醋拧,或者你的合約可能會受到錯(cuò)誤且不可逆轉(zhuǎn)的操縱。

  智能合約帶來了新的開發(fā)范式——其不可變性要求用戶重新思考搭建應(yīng)用的方式宿百,并且需要更透徹全面的設(shè)計(jì)和開發(fā)過程趁仙。

  作者:Trail of Bits Blog

  翻譯:喏唄爾

  來源:Unitimes

  原文鏈接:https://www.kg.com/article/510392457444331520

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洪添,一起剝皮案震驚了整個(gè)濱河市垦页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌干奢,老刑警劉巖痊焊,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異忿峻,居然都是意外死亡薄啥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門逛尚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垄惧,“玉大人,你說我怎么就攤上這事绰寞〉窖罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵滤钱,是天一觀的道長觉壶。 經(jīng)常有香客問我,道長件缸,這世上最難降的妖魔是什么铜靶? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮他炊,結(jié)果婚禮上争剿,老公的妹妹穿的比我還像新娘已艰。我一直安慰自己,他們只是感情好蚕苇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布旗芬。 她就那樣靜靜地躺著,像睡著了一般捆蜀。 火紅的嫁衣襯著肌膚如雪疮丛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天辆它,我揣著相機(jī)與錄音誊薄,去河邊找鬼。 笑死锰茉,一個(gè)胖子當(dāng)著我的面吹牛呢蔫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播飒筑,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼片吊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了协屡?” 一聲冷哼從身側(cè)響起俏脊,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肤晓,沒想到半個(gè)月后爷贫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡补憾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年漫萄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盈匾。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腾务,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出削饵,到底是詐尸還是另有隱情岩瘦,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布葵孤,位于F島的核電站担钮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尤仍。R本人自食惡果不足惜箫津,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苏遥,春花似錦饼拍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至教硫,卻和暖如春叨吮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞬矩。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工茶鉴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人景用。 一個(gè)月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓涵叮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伞插。 傳聞我的和親對象是個(gè)殘疾皇子割粮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Re-Entrancy重新入口 以太坊智能合約的一個(gè)特點(diǎn)是能夠調(diào)用和使用其他外部合約的代碼。合約也通趁奈郏可以處...
    筆名輝哥閱讀 11,518評論 0 56
  • 原文:Smart contracts 正如我們在[intro]中看到的那樣舀瓢,以太坊中有兩種不同類型的帳戶:外部擁有...
    Jisen閱讀 4,941評論 1 7
  • 在整個(gè)加密貨幣市場的市值超過7000億美元之后,加密貨幣市場在過去幾個(gè)月太瘋狂了杠步,但這只是一個(gè)開始氢伟。隨著區(qū)塊鏈系統(tǒng)...
    編程狂魔閱讀 1,513評論 0 2
  • 秋天一到,很多人心情也跟著憂郁幽歼、煩躁了起來。中醫(yī)認(rèn)為肺與秋相對應(yīng)谬盐,如果秋天肺內(nèi)氣血運(yùn)行受干擾甸私,就容易引發(fā)“悲秋”的...
    湯偉霞來艾號954728閱讀 85評論 0 0
  • 簡介: 蘇青檸眼神空洞而絕望地看著顧辰風(fēng),突然發(fā)出凄厲到極點(diǎn)的笑聲飞傀。 又哭又笑皇型。 她指著顧辰風(fēng),“你…還我孩子砸烦,我...
    流云若雨08閱讀 767評論 0 0