DeFi项目在发展过程中,经常需要从旧系统迁移到新系统,比如合约升级、链迁移、架构重构等。但是DeFi系统涉及用户资产,迁移的风险极高,一旦出错可能造成巨大的经济损失。本文分享一次DeFi系统迁移的实战经验,包括迁移前的准备、迁移方案设计、数据迁移、合约部署、用户资产迁移、验证和回滚等。如果你在做DeFi相关的项目,这篇文章值得一看。

一、为什么要迁移

先说说为什么要做系统迁移。

我们的DeFi项目已经运行了一年多,随着用户量和交易量的增长,旧系统暴露出了很多问题。

首先是性能问题。旧的智能合约架构比较简单,所有功能都在一个合约里,随着功能增加,合约代码越来越臃肿,Gas费也越来越高。用户每次交易都要支付很高的Gas费,体验很差。

其次是安全问题。旧合约经过多次迭代,代码复杂度越来越高,安全审计发现了一些潜在的风险。虽然没有被攻击,但是隐患一直存在。

第三是扩展性问题。旧系统的架构很难支持新的功能,比如跨链、聚合交易、NFT抵押等。每次加新功能都要改旧合约,风险很大。

基于这些原因,团队决定开发一套全新的系统,然后把旧系统的用户和资产迁移过去。

迁移听起来简单,但是DeFi系统的迁移和传统互联网系统完全不同。因为区块链上的数据是不可篡改的,用户资产是真实的数字资产,一旦迁移出错,资产就可能永久丢失。所以整个迁移过程必须非常谨慎。

二、迁移前的准备

迁移前的准备工作非常重要,准备得越充分,迁移的风险就越小。

1. 全面梳理旧系统

首先要全面梳理旧系统的架构、数据、用户资产。我们花了两周时间,把旧系统的所有合约、所有数据结构、所有用户资产都梳理了一遍。

具体包括:

  • 旧系统有哪些合约,每个合约的功能和地址
  • 合约的存储结构,每个变量的类型和位置
  • 用户资产的种类和数量,包括代币、LP Token、抵押品等
  • 未完成的交易和订单
  • 管理员权限和多签配置

梳理完之后,我们写了一份详细的旧系统文档,作为迁移的基础。

2. 设计新系统

在梳理旧系统的同时,新系统的开发也在进行。新系统采用了模块化的架构,把不同的功能拆分成独立的合约,通过合约之间的调用来实现交互。

新系统的设计要点:

  • 模块化架构,每个合约只负责一个功能
  • 采用代理模式(Proxy),支持后续升级
  • 优化Gas费,减少不必要的存储读写
  • 更完善的权限控制和安全机制
  • 支持更多的资产类型和交易功能

新系统开发完成后,经过了两轮安全审计,修复了所有发现的问题。

3. 制定迁移方案

迁移方案是整个迁移过程的核心。我们经过多次讨论,最终确定了迁移方案。

迁移方案包括:

  • 迁移的时间窗口(选择交易量低的时段)
  • 迁移的步骤和顺序
  • 每个步骤的负责人和验证方式
  • 数据迁移的方法
  • 用户资产迁移的方法
  • 回滚方案
  • 应急预案

方案制定之后,我们在测试环境进行了多次模拟迁移,确保每个步骤都能正常执行。

4. 与用户沟通

迁移会影响用户的正常使用,所以必须提前和用户沟通。我们在迁移前一周就发布了公告,说明迁移的时间、原因、影响,以及用户需要做的事情。

同时,我们在Discord和Telegram社群里回答用户的问题,消除用户的顾虑。

三、迁移方案设计

详细说说迁移方案的设计。

整体策略:暂停旧系统 + 快照 + 迁移 + 启动新系统

我们采用的是"停机迁移"的策略,也就是在迁移期间暂停旧系统的所有功能,对用户资产进行快照,然后把资产迁移到新系统,最后启动新系统。

这种策略的优点是简单、安全,迁移期间不会有新的交易产生,数据一致性容易保证。缺点是需要停机,用户在迁移期间不能使用系统。

我们选择在周末的凌晨进行迁移,这个时段交易量最低,对用户的影响最小。

迁移步骤

具体的迁移步骤如下:

  1. 暂停旧系统:调用旧合约的暂停功能,停止所有用户交易和资产操作。
  2. 资产快照:对旧系统的所有用户资产进行快照,记录每个用户的资产数量。
  3. 验证快照:验证快照数据的准确性,确保所有用户的资产都被正确记录。
  4. 部署新合约:在区块链上部署新系统的所有合约。
  5. 初始化新系统:配置新系统的参数,设置管理员权限。
  6. 资产迁移:根据快照数据,在新系统中为每个用户铸造对应的资产。
  7. 验证迁移结果:对比新旧系统的资产数据,确保完全一致。
  8. 启动新系统:开启新系统的所有功能,用户可以开始使用。
  9. 旧系统处理:旧系统永久关闭,用户剩余的资产可以通过专门的通道提取。

数据迁移的方法

数据迁移是最关键的部分。因为区块链上的数据不能直接"搬"到新合约,所以我们采用的是"快照 + 重新铸造"的方法。

具体来说:

  1. 在旧系统暂停后,读取所有用户的资产余额,生成快照数据
  2. 把快照数据上传到IPFS,生成哈希值,确保数据不可篡改
  3. 在新系统中,根据快照数据,为每个用户铸造对应的资产
  4. 铸造完成后,对比新旧系统的资产总量和每个用户的余额,确保一致

为了防止铸造过程中出错,我们采用了分批铸造的方式,每批100个用户,铸造完一批就验证一批。如果发现问题,可以及时停止和修正。

四、迁移的执行

迁移当天,整个团队都在线上,按照预定的方案执行。

第一步:暂停旧系统

迁移开始后,首先由多签管理员调用旧合约的暂停功能。暂停之后,用户无法进行任何交易和资产操作。

我们在社群里同步了进度,告诉用户系统已经暂停,迁移正在进行中。

第二步:资产快照

暂停之后,我们开始对用户资产进行快照。我们写了一个脚本,遍历所有用户的地址,读取他们在旧系统中的资产余额。

快照的过程比预想的要慢,因为用户数量比较多,而且要读取多个合约的数据。整个快照过程花了大约一个小时。

快照完成后,我们生成了一个JSON文件,包含所有用户的资产数据。然后计算了文件的哈希值,上传到IPFS保存。

第三步:验证快照

快照完成后,我们进行了严格的验证:

  • 验证每个资产的总量是否和合约中的总量一致
  • 随机抽取100个用户,手动核对他们的资产余额
  • 验证所有用户的资产总和是否等于总量

验证通过之后,才进入下一步。

第四步:部署新合约

快照验证通过后,我们开始部署新系统的合约。新系统有8个合约,按照依赖顺序依次部署。

部署过程中遇到了一个小问题:其中一个合约的构造函数参数有误,部署后发现配置不对。我们立刻停止了部署,修正参数后重新部署。因为有预案,这个问题没有造成大的影响。

所有合约部署完成后,我们记录了所有合约的地址,然后进行了配置初始化。

第五步:资产迁移

合约部署完成后,开始资产迁移。我们按照预定的分批方案,每批100个用户,依次在新系统中铸造资产。

铸造的过程比较顺利,没有出现大的问题。但是有几个用户的地址是合约地址(比如其他DeFi协议的合约),铸造的时候需要特殊处理。我们提前考虑到了这种情况,有专门的处理逻辑。

整个资产迁移过程花了大约两个小时。

第六步:验证迁移结果

资产迁移完成后,我们进行了全面的验证:

  • 新系统中每个资产的总量是否等于旧系统的总量
  • 每个用户的资产余额是否和快照一致
  • 随机抽取用户进行手动核对
  • 尝试进行几笔测试交易,验证系统功能正常

验证全部通过之后,才启动新系统。

第七步:启动新系统

验证通过后,我们开启了新系统的所有功能。用户可以开始存款、交易、提取资产。

同时,我们在社群里宣布迁移完成,感谢用户的耐心等待。

五、遇到的问题和解决方案

迁移过程中遇到了一些问题,这里分享一下。

问题1:Gas费飙升

迁移当天,因为我们的交易比较多,加上网络本身比较拥堵,Gas费一度飙升到了平时的三倍。

解决方案:我们提前准备了足够的ETH,而且交易都设置了合理的Gas价格。虽然Gas费高了一些,但是交易都能正常打包。后来我们把非紧急的交易推迟到Gas费降低后再执行。

问题2:合约部署参数错误

前面提到过,有一个合约的构造函数参数有误。

解决方案:我们在部署后立刻进行了配置检查,发现了问题。因为合约还没有正式使用,所以可以重新部署。这个问题提醒我们,部署后的检查非常重要。

问题3:部分用户资产为零

快照的时候发现有一些用户的资产为零,但是他们有过交易记录。

解决方案:经过分析,这些用户已经把资产全部提取了,所以余额为零。这种情况不需要迁移,直接跳过即可。我们在快照脚本里加了过滤逻辑,只迁移有资产的用户。

问题4:合约地址的资产

有一些资产在合约地址里,而不是普通用户地址里。

解决方案:我们提前梳理了所有合约地址的资产,这些资产属于协议本身,不需要迁移给用户。在快照的时候排除了这些地址。

六、迁移后的工作

迁移完成后,还有一些后续工作。

1. 监控和观察

迁移后的前几天,我们安排了专人24小时监控系统状态,包括交易量、Gas费、合约异常事件等。一旦发现问题,立刻处理。

2. 用户支持

迁移后有一些用户遇到了问题,比如找不到自己的资产、不知道怎么使用新系统等。我们在社群里安排了客服,及时回答用户的问题。

3. 旧系统的收尾

旧系统永久关闭后,还有一些用户没有及时提取资产。我们设置了一个为期三个月的提取窗口,用户可以在这个窗口内从旧系统提取剩余的资产。三个月后,旧系统的合约将被废弃。

4. 总结和复盘

迁移完成后,我们做了一次详细的复盘,总结了迁移过程中的经验和教训,形成了一份迁移手册,供以后参考。

七、经验总结

最后总结一下这次迁移的经验。

1. 准备工作要充分

迁移前的准备工作决定了迁移的成败。旧系统梳理、新系统开发、方案设计、模拟测试,每一步都不能少。准备得越充分,迁移越顺利。

2. 验证是重中之重

每一步操作之后都要验证,验证通过才能进行下一步。尤其是资产迁移,必须确保数据完全一致。宁可多花时间验证,也不要带着问题往下走。

3. 回滚方案必须有

虽然我们最终没有用到回滚方案,但是必须要有。万一迁移过程中出现不可恢复的问题,回滚方案是最后的保障。

4. 沟通很重要

和用户的沟通、团队内部的沟通都很重要。提前告知用户迁移计划,迁移过程中同步进度,迁移后及时解答用户问题,这些都能减少用户的焦虑和不满。

5. 选择合适的时间窗口

选择交易量低的时段进行迁移,可以减少对用户的影响,也能降低Gas费和网络拥堵的风险。

八、写在最后

DeFi系统的迁移是一项高风险的工作,涉及用户的真实资产,必须慎之又慎。但是只要准备充分、方案合理、执行严谨、验证到位,迁移是可以安全完成的。

这次迁移从准备到完成,花了将近两个月的时间。虽然过程很辛苦,但是结果是好的。新系统的性能提升了很多,Gas费降低了60%,用户体验也更好了。

如果你也在做DeFi项目,面临系统迁移的需求,希望这篇文章能给你一些参考。如果有不同的经验和见解,欢迎在评论区交流。

最后用一句话结束本文:"DeFi无小事,每一步都要谨慎。"愿每一个DeFi项目都能安全稳定地运行,保护好用户的资产。