38

智能合约迁移的工作原理

 5 years ago
source link: https://www.freebuf.com/articles/blockchain-articles/188938.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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

您需要合约迁移功能

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

迁移有两个步骤:

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

接下来就让我们来看看细节,成本和运营方面的后果。

如何执行迁移

第1步:数据恢复

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

如果可能,先暂停合约,这对用户更加透明,并防止了黑客攻击不懂迁移的用户。数据恢复将取决于您的数据结构:

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

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

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

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

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

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

如果您没有同步区块链,则可以使用Google BigQuery API。

图1显示了如何通过BigQuery收集给定令牌的所有地址:

3EvQnez.jpg!web

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

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

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

第2步:数据写入

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

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

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

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

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

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

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

yMjUfmQ.jpg!web

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

迁移成本和对交易所有什么影响。

迁移成本

数据的恢复是在链外完成的,因此是免费的。Ethereum-etl可以在本地使用。谷歌的BigQuery API提供足够的免费信用来支付其使用。

但是,发送到网络的每个事务和新合约存储的每个字节都有成本。

使用图2的batchTransfer功能,转移200个账户的成本约为2.4M gas,平均gas价格(10 Gwei)的5.04美元(ETH以今天的价格计算)。粗略地说,迁移一个数据需要0.025美元

如果我们看看按市值排名的前五大ERC20代币的持有人数:

qi2E3uJ.jpg!web

交易所

部署新合约可能会对运营产生影响。对于基于token的合约来说,在迁移期间与交换机协作非常重要,以确保将列出新合约,并且将丢弃之前的合约。

幸运的是,前面的标识迁移事件,表明交流有可能进行合作。

智能合约迁移与可升级智能合约

可升级的合约有几个缺点:

需要详细的EVM和Solidity的专业知识,基于委托调用的代理要求开发人员掌握EVM和Solidity是必要的。

增加了复杂性和代码大小,合约更难审查,更有可能会有bug和安全问题。

增加了要处理的密钥数量,合约将需要多个授权用户(所有者,升级者)。授权用户越多,攻击面越大。

每笔交易的gas费用增加。合约变得比没有升级机制的同一版本更具竞争力。

他们鼓励在部署后解决问题。如果开发人员知道无法轻松更新合约,他们往往会更彻底地测试和审查合约。

它们减少了用户对合约的信任。用户需要信任合约的所有者,这会阻止真正分散的系统。

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

合约需要经常更新。如果要定期修改合约,则定期迁移的成本可能高到足以证明可升级性机制的合理性。

合约要求固定地址。合约的迁移需要使用新地址,这可能会破坏与第三方的交互(例如与其他合约的交互)。

合约迁移实现了升级带来的好处,但缺点很少。升级相对于迁移的主要优点是升级成本更低。然而,这种成本并不能证明所有的缺点。

建议

在合约部署之前准备迁移过程、使用事件来促进数据跟踪。

如果要购买可升级版的合约,则还必须准备迁移程序,因为您的密钥可能会受到损害,或者您的合约可能会遭受错误且不可逆转的操纵。

智能合约带来了新的发展模式,它们的不可变性要求用户重新思考他们构建应用程序的方式,并要求彻底的设计和开发过程。

*本文由Trailofbits团队首发于blog,由猎豹区块链安全团队翻译与编辑,转载请注明来自FreeBuf.COM


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK