一文读懂如何实现智能合约迁移(怎么能智能)
本篇文章给大家谈谈一文读懂如何实现智能合约迁移对应的信息,希望对各位有所帮助,不要忘了收藏本站喔。
智能合约也会遭受损害:比如存在漏洞、合约拥有者的钱包被盗,或者由于某种错误设置导致死锁。
如果你为自己的企业开发了智能合约,那么你必须做好应对类似事件的预案。
在很多情况下,唯一的解决方案是部署一个新的合约实例,并将数据迁移到该实例中。
如果你打算开发一个可升级的合约,迁移程序(migration procedure)将有助于免除可升级性机制(upgradability mechanism)的潜在危险[1]。
本文旨在为你详细讲解如何实现合约迁移。
你需要嵌入合约迁移功能即使是零漏洞的合约也可能被窃取的私钥劫持。
先前的Bancor [2] 和 KICKICO [3]黑客事件表明:攻击者可以损害智能合约钱包。
在这些攻击中,即使合约具备可升级性机制,也可能无法修复已部署的智能合约。
唯一的解决办法是重新部署并正确初始化新的合约实例,以便为用户恢复功能。
因此,所有智能合约开发者必须在合约设计阶段整合一个迁移程序。
此外,企业必须做好在合约损害事件发生时实施迁移的准备。
迁移过程有两个步骤:恢复要迁移的数据将数据写入新合约我们来深入探讨其中的细节、成本和操作后果。
第一步:数据恢复你需要从区块链的某个特定区块中读取数据。
要想从损害事件(黑客攻击或故障)中恢复数据,你需要在事件发生之前使用这个区块,或者过滤攻击者的操作。
如果可以的话,请暂停合约。
这对于用户来说更加透明公平,并能阻止攻击者盯上那些对迁移不知情的用户。
数据恢复的具体操作取决于你的数据结构。
对于简单类型的公共变量(public variables,例如uint或address)来说,通过它们的getter来检索特定值就可以了。
而对于私有变量(private variables),你可以依赖事件,也可以计算变量的内存偏移量,然后使用 getStorageAt [4] 函数检索它的值。
由于元素的数量是已知的,因此数组也很容易恢复。
上述技术你都可以使用。
至于映射(mappings)的话,情况有点复杂。
由于键(Keys)在映射过程中不会被存储,所以你需要将它们进行恢复才能访问对应的值(Values)。
为了简化链下追踪的过程,我们建议在值被存储在映射中时触发事件(emit events)。
在ERC20代币合约中,你可以通过追踪代币的Transfer事件的地址来获取代币持有者列表。
这个过程很难。
对此,我们准备了两个帮助方案:第一,你可以扫描区块链并自行检索持有者:第二,你可以依靠以太坊区块链的公开GoogBigTable存档。
如果你不熟悉web3 API,无法从区块链中提取信息。
那么你可以使用ethereum-etl [5],其提供了一系列脚本来简化数据提取的过程。
如果你没有已经完成同步的区块链,那么你可以使用Google BigQuery API。
图1展示了如何通过BigQuery来收集某个特定代币的所有地址:图1:利用Google BigQuery来恢复那些与在0x41424344这个地址中的代币相关联的Transfer事件的所有地址BigQuery提供对区块号的访问,因此你可以将查询结果调整为返回特定区块的交易。
一旦你恢复了所有代币持有者的地址,你就可以离线查询balanceOf函数 [6] 以恢复与每个持有者相关的余额,同时过滤余额为零的帐户。
现在我们知道如何检索将要迁移的数据,接下来我们要将数据写入新合约。
第二步:数据写入完成数据收集后,你需要开启新合约。
对于简单变量,你可以通过合约的构造函数来设置相应的值。
如果你的数据无法保存在单笔交易中,那么情况会有点复杂,成本也会略高。
每笔交易都包含在某个区块中,该区块限制了其交易可以使用的gas总量(即所谓的GasLimit)。
如果某笔交易的gas 成本接近或超过此限制,那么矿工将不会将其打包进该区块内。
因此,如果想要迁移大量数据,那么你必须将数据迁移拆分成多笔交易。
这类情况的解决方案是:在合约中添加初始化状态,只有合约拥有者才能更改状态变量,并且用户无法执行任何操作。
对于ERC20代币,上述过程将需要以下步骤:在初始化状态下部署合约,迁移余额,将合约的状态移至生产状态。
初始化状态可以通过使用OpenZeppelin提供的Pausable功能 [7] 和指示初始化状态的布尔值(boolean)来实现。
为了降低成本,我们可以使用batchTransfer(批量传输)函数(该函数允许你在单笔交易中设置多个帐户)来实现余额的迁移:图2:batchTransfer函数示例关于迁移的担忧在迁移合约时,会出现两个主要问题:1. 需要花费多少迁移成本?2. 对交易所有什么影响?迁移成本数据恢复是在在链下完成的,因此是免费的:Ethereum-etl [8]也可以在本地使用:谷歌的BigQuery API [9] 提供足够的免费额度来支付其使用费用。
但是,发送到网络中的每一笔交易和新合约存储的每个字节都需要花费成本。
关于一文读懂如何实现智能合约迁移的信息到此就结束了,如果你还想了解更多这方面的信息,记得收藏关注本站。相关文章
- 通证激励措施:加密经济中的代币、特权、奖励及处罚
- 稳定币:让投资数字货币更容易(数字货币,代币,稳定币)
- 对话Polymath:揭秘证券型代币背后的力量
- 利用区块链实现数据确权与流通(区块链的数据技术)
- 数字化供应链金融新动向(数据供应链金融)
- 嘉兴市嘉善县率先搭建跨省域区块链平台——有效破解长三角一体化示范区政务数据互认共享难问题
- 密歇根州或将立法定罪篡改区块链数据的行为(密执安州与密歇根州)
- 斯里兰卡央行计划开发基于区块链的KYC系统(斯里兰卡中国项目)
- 数据显示:2019年上半年ICO融资总额不及去年6月的融资额
- Eth1.0 链上的 ETH 将如何迁移至 Eth2.0 中?(eth0 eth0.1 eth0.2)