请选择 进入手机版 | 继续访问电脑版
智能合约 +关注 已有2人关注 +发表新主题

智能合约迁移的工作原理(一)

发表在 2019-10-15 10:52 来自PC 复制链接 手机看帖 扫一扫!手机看帖更爽 0 664

导读:智能合约是很容易受到攻击的——合约上存在的bug、用户的钱包的漏洞、或者设置上的疏忽,都会导致被攻击。如果您使用了智能合约,则必须准备好应急预案,在大多数情况下,唯一有效的解决方案是部署新的智能合约实例,并且将所有数据迁移到该实例中。

如果你计划开发可升级的智能合约,迁移过程将的最大风险是在升级机制的过程中。

本篇文章将带你了解智能合约迁移的工作原理。

*本文由Trailofbits团队首发于blog,由猎豹区块链安全团队翻译与编辑*
(译文链接:https://blog.trailofbits.com/201 ... ct-migration-works/

1. 你需要智能合约迁移

即使是没有任何漏洞的智能合约,用户也可能会因为私钥的丢失而被盗。在这类攻击中,即使智能合约具备了可升级的机制,也可能无法修复已部署的智能合约,因此需要部署并正确初始化合约的新实例,以便为用户恢复功能,所有开发人员必须在智能合约设计阶段就集成迁移功能,并且必须准备好折中方案进行迁移。

迁移有两个步骤:

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

让我们来看看细节、成本和运营后果。

2.如何执行迁移

第1步:数据恢复

需要从区块链中的特定区块来读取数据,如果是从事件(黑客或故障)中恢复,需要在事件发生之前,使用阻止或过滤攻击者的操作。

如果可能,先暂停合同,这对用户更加透明,并防止了黑客攻击不懂迁移的用户。

数据恢复将取决于您的数据结构:

对于简单类型的公共变量(例如uint或address),通过getter的检索值是微不足道的。对于私有变量,您可以依赖事件,也可以计算变量的内存偏移量,然后使用getStorageAt函数检索。由于元素的数量是已知的,因此阵列也很容易恢复。

映射的情况就有点复杂了,不存储映射的键,需要恢复它们才能访问这些值。为简化离线跟踪,我们建议在映射中存储值时发出事件。

对于ERC20智能合约来说,可以通过跟踪转移事件的地址找到所有持有者的列表,这个过程很难。

我们准备了两个方案来帮你:

首先,可以扫描区块链并自行检索持有者; 在第二种情况下,可以依赖以太网区块链公开的Google BigTable存档。

如果您不熟悉web3 API以从区块链中提取信息,则可以使用ethereum-etl,它提供了一组脚本来简化数据提取。

如果您没有同步区块链,则可以使用Google BigQuery API。图1显示了如何通过BigQuery收集给定令牌的所有地址:


图1:使用Google BigQuery恢复地址0x41424344处令牌的所有Transfer事件

BigQuery提供对块编号的访问,因此可以调整此查询以将事务返回到特定块。

一旦恢复了所有持有者的地址,就可以离线查询balanceOf功能以恢复与每个持有者相关的余额。过滤余额为空的帐户。

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

第2步:数据写入

收集数据后,就要创建新的智能合约了。

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

如果数据无法保存在单个中,则情况会稍微复杂和昂贵。每个交易都包含在一个区块中,该区块限制了其交易可以使用的gas总量(所谓的“Gas Limit”)。如果交易的gas成本接近或超过此限制,矿工将不会再打包。因此,如果要迁移大量数据,则必须将迁移拆分为多个任务。

解决方案是在智能合约中添加初始化状态,只有所有者才能更改状态变量,用户无法执行任何操作。

对于ERC20令牌,该过程将采取以下步骤:

1)在初始化状态下部署契约,
2)迁移余额,
3)将合约的状态转移到生产状态。
4)初始化状态可以使用Pausable功能和指示初始化状态的布尔值来实现。

为了降低成本,可以使用批量传输功能实现余额的迁移,该功能允许您在单个事务中设置多个帐户:


在迁移合约时,会出现两个主要问题:
迁移成本和对交易所有什么影响。



扫描二维码,手机查看本帖
显示全部楼层 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部
快速回复 发贴