程序维护中的一个基本问题是——缺陷修复总会以%的机率引入新的bug。所以整个过程是前进两步,后退一步。——布鲁克斯《人月神话》
智能合约本质上是程序,既然是程序,缺陷就不可避免。即便是经过大量测试和审计的智能合约,仍然可能会有漏洞。合约的漏洞如果被攻击者利用,可能造成用户资产的损失,导致严重的后果。漏洞的修复往往需要通过合约升级来实现。除了漏洞修复,新特性的加入也需要合约升级。因此合约的可升级性非常有必要。本期Rust智能合约养成日记,将为大家介绍Rust合约的升级方式。2.Solidity合约常见升级方式
以太坊中,智能合约具有不可变性,一旦被部署到链上,没有人可以改变它。
那么如果合约存在漏洞或合约需要添加新功能,该如何修改合约的代码?解决方案是将新的合约部署到区块链上。
Crust Network 佑安:Crust将于5月进行Maxwell先行网测试:金色财经现场报道,4月23日,数御未来——2021数据与存储产业峰会在成都举办。在会议现场,Crust Network PR 佑安介绍,crust致力于解决三个核心问题:证明、激励、服务。
此外,佑安表示,以太坊以及COSMOS 的tendermint对于链的可制定化程度不高,对于一条需要频繁交易且追求稳定性的应用链来说非常不友好。
而波卡生态有四大优势包括1,波卡异构分片的概念是目前以太坊想解决的扩容问题;2,波卡生态内外的信息交互,不管是生态内,还是生态外,都可以通过转接桥,或者是插线NP传输协议;3,高度可定制性;4,链上治理和生态升级。
佑安指出,这些优势让Crust选择了波卡生态。不过,Crust虽然选择了波卡生态,但crust项目是没有以太坊波卡边界的。
据佑安介绍,5月Crust将开启第二阶段测试(Maxwell先行网 ),将基于真实场景的存储订单对整个网络的服务能力进行全方位的测试。Maxwell先行网与主网的规则机制完全相同,奖励的CRU代币也将是基于波卡链。[2021/4/23 20:51:16]
该方法面临的挑战是,solidity每次部署合约后,合约都会被分配一个唯一的地址。因此所有用到了该合约的DApps都需要修改合约地址来适配新的合约。此外,旧版本合约中的状态需要迁移到新版本合约中,状态较为复杂的合约迁移的工作量很大,容易出错,而且复制数据的Gas费用高。
Russell Coin罗素币即将上线ZBG:据官方消息,Russell Coin罗素币,将于2021年3月初上线ZBG交易平台。
罗素币(Russell Coin, 简称RC)于2017年11月21日创世,总量2100万个。RC科学的采用了完全去中心化的主节点奖励计划,POW挖矿纳税给主节点的激励机制,结合最新X20R算法,达到电脑挖矿能耗更低,环形加密匿名性更强。更多活动详情请访问官网。[2021/2/26 17:55:11]
因此,我们通常采用数据和逻辑分离的架构,将数据保存在一个不处理任何逻辑的合约中,所有的逻辑在另一个合约中实现。通常合约升级修改的是逻辑,使用该架构只需要升级逻辑合约,不需要担心状态迁移。
为了解决这个问题,可以使用代理合约,具体架构如下图所示。
Bittrex支持的加拿大交易所CatalX与Prime Trust达成合作:由Bittrex支持的加拿大加密货币交易所CatalX已与Prime Trust达成合作,CatalX的客户现在可以使用Prime Trust的PrimePay数字支付服务,以及该公司的存取款支付处理技术。作为该服务的一部分,CatalX还将整合Prime Trust的“合规即服务”(Compliance As A Service)模式,为所有账户提供KYC和AML服务。(NS Banking)[2020/5/9]
代理合约用来来存储数据,并且使用delegatecall调用逻辑合约A,这样合约A读写的数据都存储在代理合约中。如果需要升级逻辑合约,部署新的合约B,然后发一条交易给代理合约,让代理合约指向新的逻辑合约B即可。
XBIT算力存证即将上线TRUST系统:据官方消息,XBIT算力存证即将于本月上线TRUST算力存证信托系统,主要功能包括第三方矿机算力接入、XBIT算力存证发行、XBIT算力存证资产托管等。同时,XBIT于今天上线了猜币价赢比特币活动,助力比特币减半行情,XBIT为本次活动设立了10个比特币超级奖池。本次活动截止4月30日,为期一个月。
XBIT算力存证通过多机型融合算法,结合市场需求,创新了参与挖矿的方式,降低挖矿行业准入门槛,提高矿业资产存证化流通效率,以期能实现人人都能参与挖矿的长远目标。详情见原文链接。[2020/4/1]
3.NEAR合约升级常用方法
接下来我们将以StatusMessage项目为例,给大家介绍NEAR合约的常用升级方法,如下是StatusMessage的合约代码
我们先将编译好的合约部署在测试网上。
transaction如下
接着我们调用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.3?Migrate升级智能合约
NEAR提供了Migrate方法去帮助我们对合约进行升级,针对3.2中所出现的错误,我们在新的合约中加入migrate方法:
代码中的#表示在migrate函数执行前不要加载状态。接着,我们重新部署合约,但是在部署的同时调用migrate方法
如下所示,该合约被成功部署:
我们尝试调用合约新增的方法get_tagline去获取新增的数据taglines
可以看到方法被成功调用,旧的合约数据也被迁移到新的合约
4.合约升级的安全考量
合约安全升级首先要考虑权限控制,一般合约只能由开发者或DAO升级。上一期Rust智能合约养成日记合约安全之权限控制介绍了特权函数的访问控制,一般合约的升级函数为onlyowner函数,确保只能由owner调用。
我们推荐尽可能将合约的owner设置为DAO,通过提案和投票来共同管理合约。因为owner设置为个人账户,合约高度中心化,owner可以随意修改合约数据,还存在owner私钥丢失的风险。
除此之外,开发者在做合约迁移时,还可以考虑以下几点建议
在迁移函数前加入#,确保执行迁移函数前不加载状态。
迁移完成后尽量删除迁移函数,确保迁移函数只被调用一次。
新增的数据结构在迁移时完成初始化。
标签:USTBITCRUCrustInjustice SamuraiBitRentSafari Crushcrust币暴跌
智能合约编程语言Solidity,Rust语言原生支持浮点数运算。然而,浮点数运算存在着无法避免的计算精度问题.
1900/1/1 0:00:00据浙江法制报3月30日报道,去年6月,唐某以USDT向钱某、袁某二人出借40万元,并签署《借条》.
1900/1/1 0:00:00北京时间2022年4月2日19时,CertiK安全技术团队监测到InverseFinance被恶意利用,导致价值约1450万美元的资产受到损失.
1900/1/1 0:00:00Gate.iowilllaunchaDailySharkFinSaturdaySpecialproductunderBTCwithanannualizedyieldof3%~25%.
1900/1/1 0:00:00随着俄乌冲突局势暂缓,俄罗斯杜马能源委员会主席表示,愿意接受比特币作为自然资源出口的支付方式;同时伴随美联储加息以及央行放水等西方政策的变化,金融市场回暖反弹,比特币价格回弹至48000美金.
1900/1/1 0:00:00活動時間:2022年04月01日08:00至2022年04月08日07:59點擊按鈕,立刻參與活動活動一:參加Biswap(BSW)學習,參與瓜分75,000美元等值BSW卡券獎勵活動期間.
1900/1/1 0:00:00