一文读懂如何实现智能合约迁移

ETH区块大康2018-11-09 00:10:34  阅读 -评论 0  阅读原文

智能合约也会遭受损害:比如存在漏洞、合约拥有者的钱包被盗,或者由于某种错误设置导致死锁。如果你为自己的企业开发了智能合约,那么你必须做好应对类似事件的预案。在很多情况下,唯一的解决方案是部署一个新的合约实例,并将数据迁移到该实例中。

如果你打算开发一个可升级的合约,迁移程序(migration procedure)将有助于免除可升级性机制(upgradability mechanism)的潜在危险[1]

本文旨在为你详细讲解如何实现合约迁移。

你需要嵌入合约迁移功能

即使是零漏洞的合约也可能被窃取的私钥劫持。先前的Bancor [2] 和 KICKICO [3]黑客事件表明:攻击者可以损害智能合约钱包。在这些攻击中,即使合约具备可升级性机制,也可能无法修复已部署的智能合约。唯一的解决办法是重新部署并正确初始化新的合约实例,以便为用户恢复功能。

因此,所有智能合约开发者必须在合约设计阶段整合一个迁移程序。此外,企业必须做好在合约损害事件发生时实施迁移的准备。

迁移过程有两个步骤:

  1. 恢复要迁移的数据
  2. 将数据写入新合约

我们来深入探讨其中的细节、成本和操作后果。

第一步:数据恢复

你需要从区块链的某个特定区块中读取数据。要想从损害事件(黑客攻击或故障)中恢复数据,你需要在事件发生之前使用这个区块,或者过滤攻击者的操作。

如果可以的话,请暂停合约。这对于用户来说更加透明公平,并能阻止攻击者盯上那些对迁移不知情的用户。

数据恢复的具体操作取决于你的数据结构。

对于简单类型的公共变量(public variables,例如 uint 或 address)来说,通过它们的getter来检索特定值就可以了。而对于私有变量(private variables),你可以依赖事件,也可以计算变量的内存偏移量,然后使用 getStorageAt [4] 函数检索它的值。

由于元素的数量是已知的,因此数组也很容易恢复。

上述技术你都可以使用。

至于映射(mappings)的话,情况有点复杂。由于键(Keys)在映射过程中不会被存储,所以你需要将它们进行恢复才能访问对应的值(Values)。为了简化链下追踪的过程,我们建议在值被存储在映射中时触发事件(emit events)。

ERC20 代币合约中,你可以通过追踪代币的Transfer事件的地址来获取代币持有者列表。这个过程很难。

对此,我们准备了两个帮助方案:第一,你可以扫描区块链并自行检索持有者;第二,你可以依靠以太坊区块链的公开Goog BigTable 存档。

如果你不熟悉web3 API,无法从区块链中提取信息。那么你可以使用ethereum-etl [5],其提供了一系列脚本来简化数据提取的过程。

如果你没有已经完成同步的区块链,那么你可以使用Google BigQuery API。图1展示了如何通过BigQuery来收集某个特定代币的所有地址:

图1:利用Google BigQuery来恢复那些与在0x41424344这个地址中的代币相关联的Transfer事件的所有地址

BigQuery提供对区块号的访问,因此你可以将查询结果调整为返回特定区块的交易。

一旦你恢复了所有代币持有者的地址,你就可以离线查询 balanceOf 函数 [6] 以恢复与每个持有者相关的余额,同时过滤余额为零的帐户。

现在我们知道如何检索将要迁移的数据,接下来我们要将数据写入新合约。

第二步:数据写入

完成数据收集后,你需要开启新合约。

对于简单变量,你可以通过合约的构造函数来设置相应的值。

如果你的数据无法保存在单笔交易中,那么情况会有点复杂,成本也会略高。每笔交易都包含在某个区块中,该区块限制了其交易可以使用的 gas 总量(即所谓的 GasLimit)。如果某笔交易的 gas 成本接近或超过此限制,那么矿工将不会将其打包进该区块内。因此,如果想要迁移大量数据,那么你必须将数据迁移拆分成多笔交易。

这类情况的解决方案是:在合约中添加初始化状态,只有合约拥有者才能更改状态变量,并且用户无法执行任何操作。

对于 ERC20 代币,上述过程将需要以下步骤:

  1. 在初始化状态下部署合约,
  2. 迁移余额,
  3. 将合约的状态移至生产状态。

初始化状态可以通过使用 OpenZeppelin 提供的 Pausable 功能 [7] 和指示初始化状态的布尔值(boolean)来实现。

为了降低成本,我们可以使用batchTransfer(批量传输)函数(该函数允许你在单笔交易中设置多个帐户)来实现余额的迁移:

图2:batchTransfer 函数示例

关于迁移的担忧

在迁移合约时,会出现两个主要问题:

1. 需要花费多少迁移成本?

2. 对交易所有什么影响?

迁移成本

数据恢复是在在链下完成的,因此是免费的;Ethereum-etl [8] 也可以在本地使用;谷歌的 BigQuery API [9] 提供足够的免费额度来支付其使用费用。

但是,发送到网络中的每一笔交易和新合约存储的每个字节都需要花费成本。

使用图2的 batchTransfer 函数,给200个账户转账的成本约为2.4M gas ,依照本文撰写时的平均 gas 价格(10 Gwei)约为5.04美元(你也可以使用ETH Gas Station [10] 重新计算最新的数值) 。粗略计算,每迁移一个余额需要花费0.025美元。

如果我们看看按市值排名的前五大 ERC20 代币 [11] 的持有人数,我们可以得到:

如果你想迁移其它信息(例如 allowance [12] 功能),那么成本会更高。即便如此,与这些代币所拥有的金额以及升级失败的潜在成本相比,所需的成本费用依旧很低。

交易所

部署新合约可能会产生一些操作后果。对于基于代币的合约,其运营团队在迁移期间与交易所的协作非常重要,他们需要确保新合约被上线,同时旧合约将被废弃。

幸运的是,先前的代币迁移事件(例如Augur [13],Vechain [14]Tron [15])表明:交易所基本都会合作。

合约迁移 v.s. 可升级合约

在之前的博文[16]中,我们讨论了智能合约设计的趋势:即在合约内增加可升级机制。

可升级合约有几个缺点:

  • 需要掌握详细的EVM和Solidity底层专业知识。基于 delegatecall的代理要求开发者掌握EVM和Solidity内部学识。
  • 提高了复杂性和代码量。合约更难进行审查,更有可能包含漏洞和安全问题。
  • 增加了需要掌握的密钥数量。合约将需要多个授权用户(拥有者,升级者)。授权用户越多,攻击面越大。
  • 提高了每笔交易的 gas 成本。相对于同一版本但没有升级机制的合约,有升级机制的合约的竞争力下降。
  • 可升级合约鼓励在合约部署后再解决问题。如果开发人员知道无法轻松地更新合约,他们往往会更彻底地对合约进行测试和审查。
  • 可升级合约减少了用户对合约的信任。用户需要信任合约的拥有者,但这会阻碍真正的去中心系统的发展。

只有在存在强有力的论据时,合约才应具有可升级机制,例如:

  • 合约需要经常更新。如果合约需要定期修改,那么定期迁移的成本将会非常高,相比之下,可升级机制反而更加合理。
  • 合约需要一个固定的地址。合约的迁移需要使用新的地址,这可能会破坏与第三方的交互(例如与其它合约的交互)。

合约迁移在实现升级所带来的优点的同时,还避免了不少缺点。升级相对于迁移的主要优点是:升级的成本更低。然而,这种成本并不足以覆盖其所有的缺点。

建议

在合约部署之前做好迁移程序的功课。

使用事件(events)来提高数据追踪的效率。

如果你想要部署可升级合约,那么你必须准备好迁移程序,因为你的密钥可能会受到损害,或者你的合约可能会受到错误且不可逆转的操纵。

智能合约带来了新的开发范式——其不可变性要求用户重新思考搭建应用的方式,并且需要更透彻全面的设计和开发过程。

正文中涉及的链接:

[1]:https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/

[2]:https://twitter.com/Bancor/status/1016420621666963457

[3]:https://medium.com/@kickico/kickico-security-breach-issue-under-control-all-kickcoins-will-be-returned-ebe65a491dec

[4]:https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgetstorageat

[5]:https://github.com/blockchain-etl/ethereum-etl

[6]:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#balanceof

[7]:https://github.com/OpenZeppelin/openzeppelin-solidity/blob/03dfb2965c6a607e216b110910f9fce1c43d8c94/contracts/token/ERC20/ERC20Pausable.sol

[8]:https://github.com/blockchain-etl/ethereum-etl

[9]:https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics

[10]:https://ethgasstation.info/calculatorTxV.php

[11]:https://etherscan.io/tokens

[12]:https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#allowance

[13]:https://medium.com/@AugurProject/deployment-details-rep-migration-e5413ff9fb65

[14]:https://medium.com/@vechainofficial/vechainthor-wallet-ama-5650dea84ccb

[15]:https://medium.com/tron-foundation/guide-to-independence-trx-token-migration-269302b6655c

[16]:https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/

作者:Trail of Bits Blog

翻译:喏呗尔

原文链接:

https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/

【本文版权属于Unitimes,转载请保留版权信息。未经授权,不得以任何方式加以使用,包括转载、摘编、复制或建立镜像。Unitimes将追究侵权者的法律责任。合作或授权请联系contact@unitimes.media或添加微信unitimes2017】

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们kefu@lianshijie.com

参与讨论 (0 人参与讨论)

相关推荐

比特币有什么缺点?

1.交易平台的脆弱性。比特币网络很健壮,但比特币交易平台很脆弱。交易平台通常是一个网站,而网站会遭到黑客攻击,或者遭到主管部门的关闭。2.交易确认时间长。比特币钱包初次安装时,会消耗大量时间下载历史交易数据块。而比特币交易时,为了确认数据准确性,会消耗一些时间,与p2p网络进行交互,得到全网确认后,交易才算完成。3.价格波动极大。由于大量炒家介入,导致比特币兑换现金的价格如过山车一般起伏。使得比

业务中使用区块链的四种方式

业务中使用区块链的四种方式

暴走时评:区块链是一种支持像比特币这样的数字货币的公共分类帐本,并且正改变着我们的业务方式。一旦那些对匿名交易,甚至是秘密交易感兴趣的人接纳了这样一种鲜为人知的工具,加密货币就会日趋成为主流。 区块链是一种支持像比特币这样的数字货币的公共分类帐本,并且正改变着我们的业务方式。一旦那些对匿名交易,甚至是秘密交易感兴趣的人接纳了这样一种鲜为人知的工具,加密货币就会日趋成为主流。越来越多的个人和企

区块链:法定数字货币技术路线的必然选择

区块链:法定数字货币技术路线的必然选择

在人类发展史上,货币的进化从未停止。从物物交换,到金属铸币,再到纸质货币,以及当前正在发展的数字货币正在向着越来越便捷的方向进化。 比特币的出世起初并未带来轰动,但是最近几年其价格惊人的爬高创造出了一个个造富神话,引起各国政府及监管机构的关注。虽然金融专家普遍认为它只是一种资产,而非货币,但是,其背后的区块链(Blockchain)技术引起了包括各大金融机构、政府、企业及学术界的浓厚兴趣,未

用区块链记录证书,证明真伪,墨尔本大学迈出了第一步

用区块链记录证书,证明真伪,墨尔本大学迈出了第一步

墨尔本大学宣布发起区块链认证和审核计划,允许通过一种隐私、安全且持久的方式验证学生的证书。 墨尔本大学正在试验一个区块链记录维护项目,允许接收者(即学生)存储他们的证书,出于核验目的,第三方也能访问这个系统。Learning Machine是这个发布系统的开发者,他们采用的是麻省理工媒体实验室(MIT Media Lab)在2016年提交的Blockcerts开源代码。 墨尔本大学副校长格雷

日本IT巨头富士通联合日本“三大行”开发区块链p2p资金转移系统

日本IT巨头富士通(Fujitsu)与三家大型银行已经宣布计划试点一项基于区块链创建的点对点资金转移系统。 通过与日本三大行——瑞穗金融集团,三井住友金融集团和三菱UFJ金融集团——的合作,富士通将现场试验一种基于云的区块链平台,用于在个体之间发送资金,并开发一款智能手机APP来提高这个系统的可用性。 从理论上讲,这个平台将把三大行的客户法定货币账户与这个区块链系统相连接。客户然后将能够使用这

动画科普:什么是比特币?

动画科普:什么是比特币?

比特币(Bitcoin,简写BTC)概念由中本聪(化名)提出,是一种点对点、去中心化的数字资产;2009年,中本聪打包了第一个区块,并获得50枚比特币的挖矿奖励,挖矿奖励每4年减半一次,按此计算,比特币预计2140年发行完毕,总量为2100万枚。 随着比特币的发展,比特币逐渐受到认可:德国为全球首个接受比特币支付的国家;微软、戴尔等知名企业也纷纷接受比特币支付。 举个栗子,你能直接用比特币买到

3分钟理解什么是公有链、私有链、联盟链、许可链

不同的区块链有着不同的内涵和功能,在区块链领域经常出现的公有链、私有链、联盟链、许可链,这些又都代表什么意思呢? 公有链 公有链是指全世界任何人都可以随时进入系统中读取数据、发送可确认交易、竞争记账的区块链。公有链通常被认为是完全去中心化的,因为没有任何人或机构可以控制或篡改其中数据的读写。公有链一般会通过代币机制鼓励参与者竞争记账,来确保数据的安全性。比特币、以太坊都是典型的公有链。 私

区块链是比特币的底层技术,但似乎两者已走上不同的道路

区块链是比特币的底层技术,但似乎两者已走上不同的道路

比特币的出现带来了一项新的技术——区块链,不过区块链和比特币似乎已走上了两条不一样道路,作为技术的区块链被越来越多的人所看好,而性质偏向于投资的比特币似乎被更多人看衰。 成也萧何败也萧何 比特币火爆的原因是其拥有去中心化、全世界流通、专属所有权、低交易费用、无隐藏成本、跨平台挖掘的特性,这些特性促使比特币成为了很多人关注的焦点。之后众多庄家的入局让比特币一瞬间成为了热门投资产业,但这几大特

麦妖榜
更新日期 2019-09-03
排名用户贡献值
1牛市来了30910
2BitettFan24187
3等待的宿命23810
4区块大康20369
5六叶树20310
6linjm122719429
7天下无双16192
8lizhen00215280
9让时间淡忘14586
10yelanyi050511349
返回顶部 ↑