亚洲AV无码黄色高清网站|欧美最黄a级三级片|91久久偷拍视频|福利在线观看视频|BBBB免费在线|免费特级黄毛片男女拍|少妇三级片淫片在线播放|自拍一区免费av自拍|欧美日韩无码青青草AV电影|黄片高清无码视屏

風(fēng)險(xiǎn)提示:理性看待區(qū)塊鏈,提高風(fēng)險(xiǎn)意識(shí)!

智能合約遷移的工作原理

2個(gè)回答

飛魚2星評(píng)價(jià)

2020-04-26 14:25:55

智能合約遷移的工作原理

智能合約是很容易受到攻擊的——合約上存在的bug、用戶的錢包的漏洞、或者設(shè)置上的疏忽,都會(huì)導(dǎo)致被攻擊。如果您使用了智能合約,則必須準(zhǔn)備好應(yīng)急預(yù)案,在大多數(shù)情況下,唯一有效的解決方案是部署新的智能合約實(shí)例,并且將所有數(shù)據(jù)遷移到該實(shí)例中。

如果你計(jì)劃開發(fā)可升級(jí)的智能合約,遷移過(guò)程將的最大風(fēng)險(xiǎn)是在升級(jí)機(jī)制的過(guò)程中。

本篇文章將帶你了解智能合約遷移的工作原理。

*本文由Trailofbits團(tuán)隊(duì)首發(fā)于blog,由獵豹區(qū)塊鏈安全團(tuán)隊(duì)翻譯與編輯*

(譯文鏈接:https://blog、trailofbits.com/2018/10/29/how-contract-migration-works/)

1. 你需要智能合約遷移

即使是沒有任何漏洞的智能合約,用戶也可能會(huì)因?yàn)樗借€的丟失而被盜。在這類攻擊中,即使智能合約具備了可升級(jí)的機(jī)制,也可能無(wú)法修復(fù)已部署的智能合約,因此需要部署并正確初始化合約的新實(shí)例,以便為用戶恢復(fù)功能,所有開發(fā)人員必須在智能合約設(shè)計(jì)階段就集成遷移功能,并且必須準(zhǔn)備好折中方案進(jìn)行遷移。

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

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

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

讓我們來(lái)看看細(xì)節(jié)、成本和運(yùn)營(yíng)后果。

2.如何執(zhí)行遷移

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

需要從區(qū)塊鏈中的特定區(qū)塊來(lái)讀取數(shù)據(jù),如果是從事件(黑客或故障)中恢復(fù),需要在事件發(fā)生之前,使用阻止或過(guò)濾攻擊者的操作。

如果可能,先暫停合同,這對(duì)用戶更加透明,并防止了黑客攻擊不懂遷移的用戶。

數(shù)據(jù)恢復(fù)將取決于您的數(shù)據(jù)結(jié)構(gòu):

對(duì)于簡(jiǎn)單類型的公共變量(例如uint或address),通過(guò)getter的檢索值是微不足道的。對(duì)于私有變量,您可以依賴事件,也可以計(jì)算變量的內(nèi)存偏移量,然后使用getStorageAt函數(shù)檢索。由于元素的數(shù)量是已知的,因此陣列也很容易恢復(fù)。

映射的情況就有點(diǎn)復(fù)雜了,不存儲(chǔ)映射的鍵,需要恢復(fù)它們才能訪問(wèn)這些值。為簡(jiǎn)化離線跟蹤,我們建議在映射中存儲(chǔ)值時(shí)發(fā)出事件。

對(duì)于ERC20智能合約來(lái)說(shuō),可以通過(guò)跟蹤轉(zhuǎn)移事件的地址找到所有持有者的列表,這個(gè)過(guò)程很難。

我們準(zhǔn)備了兩個(gè)方案來(lái)幫你:

首先,可以掃描區(qū)塊鏈并自行檢索持有者; 在第二種情況下,可以依賴以太網(wǎng)區(qū)塊鏈公開的Google BigTable存檔。

如果您不熟悉web3 API以從區(qū)塊鏈中提取信息,則可以使用ethereum-etl,它提供了一組腳本來(lái)簡(jiǎn)化數(shù)據(jù)提取。

如果您沒有同步區(qū)塊鏈,則可以使用Google BigQuery API。圖1顯示了如何通過(guò)BigQuery收集給定令牌的所有地址:

圖1:使用Google BigQuery恢復(fù)地址0x41424344處令牌的所有Transfer事件

BigQuery提供對(duì)塊編號(hào)的訪問(wèn),因此可以調(diào)整此查詢以將事務(wù)返回到特定塊。

一旦恢復(fù)了所有持有者的地址,就可以離線查詢balanceOf功能以恢復(fù)與每個(gè)持有者相關(guān)的余額。過(guò)濾余額為空的帳戶。

現(xiàn)在我們知道如何檢索要遷移的數(shù)據(jù),我們就可以將數(shù)據(jù)寫入新合約。

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

收集數(shù)據(jù)后,就要?jiǎng)?chuàng)建新的智能合約了。

對(duì)于簡(jiǎn)單的變量,可以通過(guò)智能合約的構(gòu)造函數(shù)來(lái)設(shè)置值。

如果數(shù)據(jù)無(wú)法保存在單個(gè)中,則情況會(huì)稍微復(fù)雜和昂貴。每個(gè)交易都包含在一個(gè)區(qū)塊中,該區(qū)塊限制了其交易可以使用的gas總量(所謂的Gas Limit”)。如果交易的gas成本接近或超過(guò)此限制,礦工將不會(huì)再打包。因此,如果要遷移大量數(shù)據(jù),則必須將遷移拆分為多個(gè)任務(wù)。

解決方案是在智能合約中添加初始化狀態(tài),只有所有者才能更改狀態(tài)變量,用戶無(wú)法執(zhí)行任何操作。

對(duì)于ERC20令牌,該過(guò)程將采取以下步驟:

1)在初始化狀態(tài)下部署契約,

2)遷移余額,

3)將合約的狀態(tài)轉(zhuǎn)移到生產(chǎn)狀態(tài)。

4)初始化狀態(tài)可以使用Pausable功能和指示初始化狀態(tài)的布爾值來(lái)實(shí)現(xiàn)。

為了降低成本,可以使用批量傳輸功能實(shí)現(xiàn)余額的遷移,該功能允許您在單個(gè)事務(wù)中設(shè)置多個(gè)帳戶:

在遷移合約時(shí),會(huì)出現(xiàn)兩個(gè)主要問(wèn)題:

遷移成本和對(duì)交易所有什么影響。

3.遷移成本

數(shù)據(jù)的恢復(fù)是在鏈外完成的,因此是免費(fèi)的。Ethereum-etl可以在本地使用。谷歌的BigQuery API提供足夠的免費(fèi)信用來(lái)支付其使用。

但是,發(fā)送到網(wǎng)絡(luò)的每個(gè)事務(wù)和新合同存儲(chǔ)的每個(gè)字節(jié)都有成本。

使用圖2的batchTransfer功能,轉(zhuǎn)移200個(gè)賬戶的成本約為2.4M gas,平均gas價(jià)格(10 Gwei)的5.04美元(ETH以今天的價(jià)格計(jì)算)。粗略地說(shuō),遷移一個(gè)數(shù)據(jù)需要0.025美元。

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

4.交易所

部署新合約可能會(huì)對(duì)運(yùn)營(yíng)產(chǎn)生影響。對(duì)于基于token的合同來(lái)說(shuō),在遷移期間與交換機(jī)協(xié)作非常重要,以確保將列出新合約,并且將丟棄之前的合約。

幸運(yùn)的是,前面的標(biāo)識(shí)遷移事件,表明交流有可能進(jìn)行合作。

智能合約遷移與可升級(jí)智能合約

可升級(jí)的合約有幾個(gè)缺點(diǎn):

· 需要詳細(xì)的EVM和Solidity的專業(yè)知識(shí),基于委托調(diào)用的代理要求開發(fā)人員掌握EVM和Solidity是必要的。

· 增·加了復(fù)雜性和代碼大小,合約更難審查,更有可能會(huì)有bug和安全問(wèn)題。

· 增加了要處理的密鑰數(shù)量,合約將需要多個(gè)授權(quán)用戶(所有者,升級(jí)者)。授權(quán)用戶越多,攻擊面越大。

· 每筆交易的gas費(fèi)用增加。合約變得比沒有升級(jí)機(jī)制的同一版本更具競(jìng)爭(zhēng)力。

· 他們鼓勵(lì)在部署后解決問(wèn)題。如果開發(fā)人員知道無(wú)法輕松更新合同,他們往往會(huì)更徹底地測(cè)試和審查合約。

· 它們減少了用戶對(duì)合約的信任。用戶需要信任合約的所有者,這會(huì)阻止真正分散的系統(tǒng)。

· 只有在存在強(qiáng)有力的論據(jù)時(shí),合約才應(yīng)具有可升級(jí)機(jī)制,例如:

· 合約需要經(jīng)常更新。如果要定期修改合約,則定期遷移的成本可能高到足以證明可升級(jí)性機(jī)制的合理性。

· 合約要求固定地址。合約的遷移需要使用新地址,這可能會(huì)破壞與第三方的交互(例如與其他合同的交互)。

· 合約遷移實(shí)現(xiàn)了升級(jí)帶來(lái)的好處,但缺點(diǎn)很少。升級(jí)相對(duì)于遷移的主要優(yōu)點(diǎn)是升級(jí)成本更低。然而,這種成本并不能證明所有的缺點(diǎn)。

5.小貼士

在合同部署之前準(zhǔn)備遷移過(guò)程、使用事件來(lái)促進(jìn)數(shù)據(jù)跟蹤。

如果要購(gòu)買可升級(jí)版的合約,則還必須準(zhǔn)備遷移程序,因?yàn)槟拿荑€可能會(huì)受到損害,或者您的合約可能會(huì)遭受錯(cuò)誤且不可逆轉(zhuǎn)的操縱。

智能合約帶來(lái)了新的發(fā)展模式,它們的不可變性要求用戶重新思考他們構(gòu)建應(yīng)用程序的方式,并要求徹底的設(shè)計(jì)和開發(fā)過(guò)程。


飛飛8885星評(píng)價(jià)

2020-04-26 14:26:44

智能合約(smart contract)由尼克?薩博在1994年提出。由于缺少可信的執(zhí)行環(huán)境,智能合約當(dāng)時(shí)并未產(chǎn)生實(shí)際應(yīng)用。比特幣底層技術(shù)區(qū)塊鏈天生可以為智能合約提供可信的執(zhí)行環(huán)境,以太坊進(jìn)而首次成就了基于區(qū)塊鏈的智能合約平臺(tái),以太坊的白皮書《以太坊:下一代智能合約和去中心化應(yīng)用平臺(tái)》。

智能合約的本質(zhì)

智能保證執(zhí)行安全,并減少交易成本。智能合約允許在沒有第三方的情況下進(jìn)行可信交易,且交易可追蹤、不可逆轉(zhuǎn)。智能合約是以信息化方式傳播、驗(yàn)證或執(zhí)行合同的計(jì)算機(jī)協(xié)議。智能合約程序不是單純自動(dòng)執(zhí)行的程序。它本身就是系統(tǒng)的有效參與者。它是運(yùn)行在可復(fù)制、共享的賬本上的計(jì)算機(jī)程序,可以處理信息,接收、儲(chǔ)存和發(fā)送價(jià)值。

智能合約漏洞

去中心化執(zhí)行的智能合約由于代碼開源,會(huì)導(dǎo)致安全漏洞更容易被利用卻可能無(wú)法迅速修復(fù)。2016年6月The DAO的智能合約漏洞造成損失5000萬(wàn)美元的損失,開發(fā)者未能就漏洞及時(shí)做出回應(yīng)。最終通過(guò)回滾數(shù)據(jù)塊、以太坊硬分叉挽回?fù)p失,卻嚴(yán)重?fù)p害區(qū)塊鏈的去中心化屬性。

以太坊智能合約中的問(wèn)題包括合約編程Solidity、編譯器錯(cuò)誤、以太坊虛擬機(jī)錯(cuò)誤、對(duì)區(qū)塊鏈網(wǎng)絡(luò)的攻擊、程序錯(cuò)誤的不變性以及其他尚無(wú)文檔記錄的攻擊。

智能合約的用途

區(qū)塊鏈技術(shù)的去中心化賬本功能可以被用來(lái)創(chuàng)建、確認(rèn)、轉(zhuǎn)移各種不同類型的資產(chǎn)及合約。幾乎所有類型的金融交易都可以被改造成在區(qū)塊鏈上使用,包括股票、私募股權(quán)、眾籌、債券和其他類型的金融衍生品如期貨、期權(quán)等。

智能合約工作原理

用戶承諾雙方的權(quán)利和義務(wù)編寫為電子化的機(jī)器語(yǔ)言,參與者分別用各自的私鑰簽名。簽名后的智能合約傳入?yún)^(qū)塊鏈網(wǎng)絡(luò)中。合約通過(guò)P2P的方式在區(qū)塊鏈全網(wǎng)中擴(kuò)散,驗(yàn)證節(jié)點(diǎn)會(huì)將收到的合約先保存到內(nèi)存中,等待觸發(fā)對(duì)該份合約的共識(shí)和處理。共識(shí)時(shí)間到了,驗(yàn)證節(jié)點(diǎn)會(huì)把最近一段時(shí)間內(nèi)保存的所有合約打包成一個(gè)合約集合,并算出這個(gè)合約集合的哈希值,組裝成區(qū)塊結(jié)構(gòu),擴(kuò)散到全網(wǎng);其他驗(yàn)證節(jié)點(diǎn)收到后,與自己保存的合約集合對(duì)比教驗(yàn),同時(shí)發(fā)送一份自己認(rèn)可的合約集合給其他驗(yàn)證節(jié)點(diǎn);通過(guò)多輪的發(fā)送和比較,所有驗(yàn)證節(jié)點(diǎn)最終在規(guī)定的時(shí)間內(nèi)對(duì)最新的合約集合達(dá)成一致。

每個(gè)區(qū)塊包含以下信息:當(dāng)前區(qū)塊的Hash值、前一區(qū)塊的Hash值、達(dá)成共識(shí)時(shí)的時(shí)間戳、以及其他描述信息;已經(jīng)達(dá)成共識(shí)的合約集。

智能合約執(zhí)行過(guò)程

智能合約定期檢查自動(dòng)機(jī)狀態(tài),逐條遍歷每個(gè)合約內(nèi)包含的狀態(tài)機(jī)、事務(wù)以及觸發(fā)條件;將條件滿足的事務(wù)推送到待驗(yàn)證的隊(duì)列中,進(jìn)行簽名驗(yàn)證,確保事務(wù)的有效性,等待多數(shù)驗(yàn)證節(jié)點(diǎn)達(dá)成共識(shí),成功執(zhí)行并通知用戶;未滿足觸發(fā)條件的事務(wù)將繼續(xù)存放在區(qū)塊鏈上。

事務(wù)執(zhí)行成功后,智能合約自帶的狀態(tài)機(jī)會(huì)判斷所屬合約的狀態(tài),當(dāng)合約包括的所有事務(wù)都順序執(zhí)行完后,狀態(tài)機(jī)會(huì)將合約的狀態(tài)標(biāo)記為完成,并從最新的區(qū)塊中移除該合約;反之將標(biāo)記為進(jìn)行中,繼續(xù)保存在最新的區(qū)塊中等待下一輪處理,直到處理完畢。