Rust智能合约养成日记(9)-ODAILY_NEAR:town币价格

程序维护中的一个基本问题是——缺陷修复总会以%的机率引入新的bug。所以整个过程是前进两步,后退一步。——布鲁克斯《人月神话》

1.合约升级的必要性

智能合约本质上是程序,既然是程序,缺陷就不可避免。即便是经过大量测试和审计的智能合约,仍然可能会有漏洞。合约的漏洞如果被攻击者利用,可能造成用户资产的损失,导致严重的后果。漏洞的修复往往需要通过合约升级来实现。除了漏洞修复,新特性的加入也需要合约升级。因此合约的可升级性非常有必要。本期Rust智能合约养成日记,将为大家介绍Rust合约的升级方式。

2.Solidity合约常见升级方式

以太坊中,智能合约具有不可变性,一旦被部署到链上,没有人可以改变它。

那么如果合约存在漏洞或合约需要添加新功能,该如何修改合约的代码?解决方案是将新的合约部署到区块链上。

该方法面临的挑战是,solidity每次部署合约后,合约都会被分配一个唯一的地址。因此所有用到了该合约的DApps都需要修改合约地址来适配新的合约。此外,旧版本合约中的状态需要迁移到新版本合约中,状态较为复杂的合约迁移的工作量很大,容易出错,而且复制数据的Gas费用高。

欧洲银行巨头Caceis选择Taurus提供数字托管服务:金色财经报道,总部位于法国的 Caceis 是最新一家宣布计划开发其数字资产托管服务的资产服务公司。作为法国农业信贷银行和桑坦德银行集团的资产服务部门的托管人选择了总部位于瑞士的 Taurus 来帮助提升其数字资产产品。

Caceis 将把自己的服务和系统与 Taurus 平台连接起来,重点关注三个领域——数字资产的安全托管和智能合约管理;通过区块链发行数字资产和代币化;通过 Taurus 与其他区块链连接。(finextra)[2022/6/29 1:38:58]

因此,我们通常采用数据和逻辑分离的架构,将数据保存在一个不处理任何逻辑的合约中,所有的逻辑在另一个合约中实现。通常合约升级修改的是逻辑,使用该架构只需要升级逻辑合约,不需要担心状态迁移。

为了解决这个问题,可以使用代理合约,具体架构如下图所示。

代理合约用来来存储数据,并且使用delegatecall调用逻辑合约A,这样合约A读写的数据都存储在代理合约中。如果需要升级逻辑合约,部署新的合约B,然后发一条交易给代理合约,让代理合约指向新的逻辑合约B即可。

前高盛董事总经理及雅虎高层加入TrustToken:3月11日消息,无抵押借贷协议TrueFi以及包括TrueUSD在内的Stablecoin核心团队TrustToken新增了两名高层管理人,华尔街资深人士 Bill Wolf 和资深产品经理 Ryan Christensen。Bill Wolf 将担任 TrustToken 的首席投资官,Bill 曾担任高盛、汇丰银行和瑞士信贷的董事总经理。在加入 TrustToken 之前,他是 Lobo Leasing Ltd. 的总裁兼首席执行官,该公司是 黑石(Blackstone)集团投资的直升机租赁和咨询服务公司。Ryan Christensen 将担任 TrustToken 首席产品官,他将监管产品管理、设计和市场营销部门。[2022/3/11 13:51:01]

3.NEAR合约升级常用方法

接下来我们将以StatusMessage项目为例,给大家介绍NEAR合约的常用升级方法,如下是StatusMessage的合约代码

TrustBase尔尔:宏观角度来说,牛市会持续很久,从微观角度来讲,做好生态永远都是牛市:在4月12日举办的《佟掌柜的海外朋友们优质海外项目分享》会上,TrustBase中国区负责人尔尔表示,对长久的项目而言没有牛熊市之分,做好产品,服务好客户,做好生态,则是永远的牛市。投机者看到牛市只是挣快钱,对于长期持有者或者共识者来讲,他们看重的是底层技术和生态规划,没有技术就没有生态,我们其实是基于原生元语言包建立起整个生态,不管技术生态还是开发者生态,或是社区生态,以及后期的模型生态,都是基于技术产生的,两者相辅相成。

关于细分赛道的展望,第一是NFT,Trustbase平台会推行大家第一批在实现NFT商业落地,因为开发周期足够短,另外可以产生更多的流量,毕竟金融型用户比应用型用户少很多,所以能让NFT创造更多商业价值,趁着波卡在NFT上发行是我们比较看好的赛道。第二是DeFi,这是不会衰退的赛道,金融本身是区块链的核心根本,DeFi的发展是随着区块链在不断地起伏,但永远不会衰落,这是作为区块链从业者的信仰。

Trustbase底层是波卡原生元,具有扎实底层技术的项目来讲生态规划比较长远,相对来说不惧牛熊,主要是基于未来的生态和规划。[2021/4/13 20:14:00]

我们先将编译好的合约部署在测试网上。

去中心化存储项目Crust与保险平台Tidal Finance达成合作:据官方消息,波卡生态去中心化存储项目Crust Network (CRU)宣布与多链保险平台Tidal Finance达成合作。Tidal Finance表示可以通过将文件储存在分布式网络中,从而不受任何中心化实体限制。Tidal Finance创始人Chad Liu表示,Crust Network提供的创新技术可以让任何去中心化市场受益,包括我们在Tidal Finance建立的保险市场。

注:Crust Network已获得NGC、HashCIB、SNZ等10多家机构A轮投资,此前已经获得过Web3基金会Grant,同时也是Web3 Bootcamp和Substrate Builders Program的成员。[2020/11/12 14:07:09]

transaction如下

Torus钱包现已集成至去中心化借贷协议Aave:Web3.0登录服务提供商Torus宣布Torus钱包现已集成至去中心化借贷协议Aave。目前,Torus用户可无缝登录Aave进行借贷。[2020/9/2]

接着我们调用set_status方法,向合约中存储数据

transaction如下

接下来我们详细讨论两种不同的合约升级情况

3.1合约数据结构未被修改

例如我们增加一个函数:

编译后使用deploy重新部署:

编译后使用deploy重新部署:

接着我们调用get_status方法读取之前写入的数据

原来合约中的数据能成功读取:

这是因为NEAR合约可以重复部署,如果一个账户已经部署过合约,再次调用neardeploy命令可以将新的合约代码部署到该账户上。如果我们只修改合约逻辑,不涉及数据结构的修改,可以直接使用neardeploy部署新的代码。

3.2合约数据结构被修改

我们将该合约升级,修改了原来的数据结构,去除了records,新增了taglines和bios

我们尝试再次重新部署:

合约还是成功部署了:

但是我们调用get_tagline方法读取存储的数据:

会发现出错了,错误提示如下:

Cannotdeserializethecontractstate.

具体的transaction见:

https://explorer.testnet.near.org/transactions/4hQQ1zAwU5bsbfb6tA6DQDqjmFcHsBwaBctdHaPiCKHu

这是因为合约的状态是以序列化数据的形式进行持久化存储的,重新部署合约后,代码中的数据结构变了,状态没有变,新的数据结构匹配不上旧状态,就出错了。

3.3Migrate升级智能合约

NEAR提供了Migrate方法去帮助我们对合约进行升级,针对3.2中所出现的错误,我们在新的合约中加入migrate方法:

代码中的#表示在migrate函数执行前不要加载状态。接着,我们重新部署合约,但是在部署的同时调用migrate方法

如下所示,该合约被成功部署:

我们尝试调用合约新增的方法get_tagline去获取新增的数据taglines

可以看到方法被成功调用,旧的合约数据也被迁移到新的合约

4.合约升级的安全考量

合约安全升级首先要考虑权限控制,一般合约只能由开发者或DAO升级。上一期Rust智能合约养成日记合约安全之权限控制介绍了特权函数的访问控制,一般合约的升级函数为onlyowner函数,确保只能由owner调用。

我们推荐尽可能将合约的owner设置为DAO,通过提案和投票来共同管理合约。因为owner设置为个人账户,合约高度中心化,owner可以随意修改合约数据,还存在owner私钥丢失的风险。

除此之外,开发者在做合约迁移时,还可以考虑以下几点建议

在迁移函数前加入#,确保执行迁移函数前不加载状态。

迁移完成后尽量删除迁移函数,确保迁移函数只被调用一次。

新增的数据结构在迁移时完成初始化。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金宝趣谈

[0:15ms0-3:887ms