程序维护中的一个基本问题是——缺陷修复总会以%的机率引入新的bug。所以整个过程是前进两步,后退一步。——布鲁克斯《人月神话》
1.合约升级的必要性
智能合约本质上是程序,既然是程序,缺陷就不可避免。即便是经过大量测试和审计的智能合约,仍然可能会有漏洞。合约的漏洞如果被攻击者利用,可能造成用户资产的损失,导致严重的后果。漏洞的修复往往需要通过合约升级来实现。除了漏洞修复,新特性的加入也需要合约升级。因此合约的可升级性非常有必要。本期Rust智能合约养成日记,将为大家介绍Rust合约的升级方式。
2.Solidity合约常见升级方式
以太坊中,智能合约具有不可变性,一旦被部署到链上,没有人可以改变它。
那么如果合约存在漏洞或合约需要添加新功能,该如何修改合约的代码?解决方案是将新的合约部署到区块链上。
该方法面临的挑战是,solidity每次部署合约后,合约都会被分配一个唯一的地址。因此所有用到了该合约的DApps都需要修改合约地址来适配新的合约。此外,旧版本合约中的状态需要迁移到新版本合约中,状态较为复杂的合约迁移的工作量很大,容易出错,而且复制数据的Gas费用高。
因此,我们通常采用数据和逻辑分离的架构,将数据保存在一个不处理任何逻辑的合约中,所有的逻辑在另一个合约中实现。通常合约升级修改的是逻辑,使用该架构只需要升级逻辑合约,不需要担心状态迁移。
金融科技公司Taurus将在Polygon区块链上进行资产的代币化工作:6月2日消息,瑞士金融科技公司Taurus周五宣布与Polygon整合,允许银行在Polygon上“发行、预订和服务”标记化资产。此次合作将使 Taurus 将股权和债务等资产转化为 Polygon 网络上的代币。
Taurus 确认其 70% 的客户使用其标记化功能,其中包括瑞士阿拉伯银行、瑞士信贷和德意志银行。[2023/6/2 11:55:14]
为了解决这个问题,可以使用代理合约,具体架构如下图所示。
代理合约用来来存储数据,并且使用delegatecall调用逻辑合约A,这样合约A读写的数据都存储在代理合约中。如果需要升级逻辑合约,部署新的合约B,然后发一条交易给代理合约,让代理合约指向新的逻辑合约B即可。
3.NEAR合约升级常用方法
接下来我们将以StatusMessage项目为例,给大家介绍NEAR合约的常用升级方法,如下是StatusMessage的合约代码
StarkNet正开发基于Rust的新开源定序器:1月31日消息,以太坊Layer2扩容解决方案StarkNet宣布正在开发新的StarkNet Sequencer(定序器),其在Apache 2.0许可下是开源的,首要目标是增加StarkNet吞吐量。
新的Sequencer将分阶段实现,第一个模块已可供社区审查,最终实现基于Rust的Sequencer完全取代当前基于Python的Sequencer。[2023/1/31 11:38:21]
我们先将编译好的合约部署在测试网上。
transaction如下
接着我们调用set_status方法,向合约中存储数据
Jack Dorsey公布?trust比特币捐赠基金进展:将从6名最终候选人中确定3个董事会成员:金色财经报道,据推特首席执行官Jack Dorsey披露,目前他和Jay-Z组建的比特币捐赠基金?trust已经审核了7,000多份董事会成员申请,现在已经筛选出了6名候选人,他们将进入最终面试,?trust基金会从这六个人中选择3名基金董事会成员,之后就将正式启动基金。今年二月,Jack Dorsey和Jay-Z宣布组建比特币捐赠基金?trus,募集约500枚BTC重点发展印度和非洲的加密货币业务,Jack Dorsey声称将把该基金打造为一个全盲的、不可撤销的信托,他们完全不参与决定基金未来的方向。[2021/11/24 7:08:04]
transaction如下
接下来我们详细讨论两种不同的合约升级情况
3.1合约数据结构未被修改
例如我们增加一个函数:
编译后使用deploy重新部署:
SPDR Gold Trust持仓较上日增加18.98吨:全球最大黄金ETF--SPDR Gold Trust持仓较上日增加18.98吨,当前持仓量为1278.82吨。[2020/9/22]
编译后使用deploy重新部署:
接着我们调用get_status方法读取之前写入的数据
原来合约中的数据能成功读取:
动态 | 瑞士加密支付系统UTRUST与德国Gambio.de公司建立合作:据Cointelegraph消息,瑞士加密支付系统UTRUST与德国Gambio.de公司建立合作,Gambio.de公司是德国电子商务解决方案提供商,拥有超过25000家在线商店。UTRUST表示,这将促成成千上万的商家将能够以简化的方式接受加密货币,同时在他们的银行账户中接收法定货币,以及使用专属数字钱包。该合作可帮助其扩大欧洲市场。[2018/10/10]
这是因为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私钥丢失的风险。
除此之外,开发者在做合约迁移时,还可以考虑以下几点建议
在迁移函数前加入#,确保执行迁移函数前不加载状态。
迁移完成后尽量删除迁移函数,确保迁移函数只被调用一次。
新增的数据结构在迁移时完成初始化。
标签:USTTRUSTATRUSTtrustwallet钱包转账费用trustwallet钱包下载2.2版本starlink币最新消息trustwallet官网下载地址
在多链时代,跨链是区块链行业的一个刚需。DeFi、GameFi等应用层项目对公链本身的性能需求点不同:DeFi对可组合性要求较高,GameFi对并发性能要求较高,SocialFi对重存储要求较高.
1900/1/1 0:00:00Polkadot生态研究院出品,必属精品波卡一周观察,是我们针对波卡整个生态在上一周所发生的事情的一个梳理,同时也会以白话的形式分享一些我们对这些事件的观察。本文旨在提供信息和观点,不为任何项目作背书.
1900/1/1 0:00:00拓展阅读: 详解Arweave系列二:Arweave初学者的关键术语详解Arweave系列三:Arweave初学者必不可少的工具详解Arweave系列四:何上传数据到Arweave当试图解释Arweave时.
1900/1/1 0:00:00“以太坊作为第一个拥有智能合约的区块链,凭借先发优势已经建立了相对完整的生态并沉淀了足够多的用户,但在Gas费、处理速度和可扩展性方面饱受诟病.
1900/1/1 0:00:00DAOrayakiDAO研究奖金池:2017-2021年Gitcoin简史 大家好, 我一直在向DAO的几位新成员讲述Gitcoin的口述史,这篇文章的目的是将Gitcoin的历史一次性写完,以便大家都能看到.
1900/1/1 0:00:001、前言 北京时间3月5日,知道创宇区块链安全实验室监测到BaconProtocol遭受黑客攻击损失约958,166美元,本次攻击利用重入漏洞,并凭借闪电贷扩大收益额。目前攻击者地址还没有被加入USDC的黑名单中.
1900/1/1 0:00:00