木星链 木星链
Ctrl+D收藏木星链
首页 > MANA > 正文

CON:【翻译】编写可升级的智能合约

作者:

时间:1900/1/1 0:00:00

原文链接

当使用OpenZeppelinUpgrades编写可升级合约时,有一些在编写Solidity代码时需要记住一些注意事项。

值得一提的是,这些限制源于以太坊虚拟机的工作方式,并且适用于所有使用可升级合约的项目,而不仅仅是OpenZeppelinUpgrades。

初始化器

在编写Solidity合约使用OpenZeppelinUpgrades,无需任何修改,只需要修改构造函数。由于基于代理的可升级性系统的要求,可升级合约中不能使用构造函数。要了解这个限制背后的原因,请查看代理。

这意味着,当使用OpenZeppelin可升级的合约时,您需要将其构造函数改为一个常规函数,通常命名为initialize,在那里执行所有的初始化逻辑。

//NOTE:Donotusethiscodesnippet,it'sincompleteandhasacriticalvulnerability!pragmasolidity^0

}

然而,虽然Solidity确保一个构造函数constructor在合约的生命周期内只被调用一次,但一个普通函数可以被多次调用。为了防止一个合约被多次初始化,你需要添加一个检查来确保初始化函数只被调用一次。

去中心化交易所SushiSwap推出DEX聚合器:6月6日消息,去中心化交易所SushiSwap在官方博客中宣布推出DEX聚合器,支持用户在协议上进行交易时能够获得最优价格,而无需额外添加任何步骤。

该DEX聚合器旨在为用户提供最优的定价,同时扩大用户可以交易的资产种类和流动性提供者(LPs)可以提供流动性的范围,增加他们可以获得的交易费用。未来,SushiSwap计划通过其他DEX增加对流动性的访问,并直接与做市商流量进行链接;同时,今年将继续重点改进限价订单和整体订单填充。[2023/6/6 21:18:26]

//contracts/MyContract

}

由于这种模式在编写可升级合约时非常常见,OpenZeppelinUpgrades提供了一个Initializable基础合约,它有一个initializermodifier来处理这个问题。

//contracts/MyContract

}

构造函数constructor和普通函数的另一个区别是,Solidity负责自动调用一个合约的所有基类的构造函数。在编写初始化器initializer时,你需要特别注意手动调用所有父合约的初始化器initializer。

//contracts/MyContract

数据:Q1加密货币风险投资资金较同期下降80%:金色财经报道,据研究公司 PitchBook 数据,今年第一季度加密货币初创公司的私人融资跌至 2020 年以来的最低水平。该行业的全球风险投资资金在本季度下降至 24 亿美元,较去年同期的历史最高点 123 亿美元下降 80%。

PitchBook 加密货币分析师 Robert Le 表示,这一下降并不令人意外,今年风险投资全面减少。除了利率上升之外,第一季度还见证了硅谷银行的崩溃,该银行是一家受到风险投资支持的公司广泛依赖的机构。[2023/4/17 14:08:39]

}contractMyContractisBaseContract{uint256publicx;functioninitialize(uint256_x)publicinitializer{BaseContract

}

使用可升级的智能合约库

请记住,这个限制不仅会影响你的合约,还会影响你从库中导入的合约。例如考虑OpenZeppelin合约中的ERC20:该合约在其构造函数中初始化了token的名称、符号和小数位数。

//

这意味着你不应该在你的OpenZeppelinUpgrades项目中使用这些合约。相反,请确保使用...}

韩国国会法制研究室:虚拟资产应纳入公职人员财产登记公示范围:12月27日消息,韩国国会法制研究室今日发布了一份题为“与虚拟资产相关的公职人员的腐败问题和改进”的报告,指出“像股票和房地产一样,虚拟资产也包括在公职人员财产登记、公开制度的对象中,对此的防止利害冲突的规定也应该由法律来约束。

调查机构该表示,随着最近对虚拟资产的可访问性和使用频率的增加,人们担心公职人员可能会发生与虚拟资产相关的利益冲突;因此,有必要研究防止利益冲突的规则普遍适用于所有公职人员方案,特别是要防止公职人员通过虚拟货币隐匿财产或进行不正当的财产增值获利行为。

据悉,韩国目前尚未将虚拟货币纳入公职人员财产登记公示制度。[2022/12/27 22:10:24]

无论是使用OpenZeppelin合约还是其他智能合约库,都要确保软件包被设置为处理可升级合约。

在合约中了解更多关于OpenZeppelin合约可升级的信息:Contracts:UsingwithUpgrades。

避免在字段声明中使用初始值

Solidity允许在合约中声明字段时为其定义初始值。

contractMyContract{uint256publichasInitialValue=42;//equivalenttosettingintheconstructor}

上市公司时代环球集团拟出售全部加密货币:金色财经报道,上市公司时代环球集团(02310.HK)宣布,于2022年11月30日,公司拟以129.08万港元向买方黄敏菁出售目标公司100%股权及相关贷款895.79万港元。目标集团的主要资产为加密货币。预计集团将从出售事项确认收益约900万港元。完成后,集团将不再从事投资加密货币。

公告称,自2022年起,加密货币市场出现衰退。公司一直积极寻找机会以出售集团所持的加密货币。经考虑当前的加密货币市场后,董事认为出售全部加密货币以避免手头的加密货币的市价进一步波动,符合集团的最佳利益。[2022/12/1 21:13:30]

这相当于在构造函数中设置了这些值,因此,对于可升级的合约是无效的。请确保所有初始值都在如下所示初始化函数中设置;否则,任何可升级的实例都不会设置这些字段。

contractMyContractisInitializable{uint256publichasInitialValue;functioninitialize()publicinitializer{hasInitialValue=42;//setinitialvalueininitializer}}

注意定义_常量_状态变量还是可以的,因为编译器并没有为这些变量预留存储槽,每出现一次就会被相应的常量表达式所替代。所以下面的内容在OpenZeppelinUpgrades中仍然可以使用:

英国通讯管理局:Meta等元宇宙公司无法自我监管,《在线安全法案》将进行规范:10月26日消息,英国通讯管理局(Ofcom)负责人Melanie Dawes表示,Meta和微软等公司无法自我监管他们的元宇宙,英国在监管这项技术方面处于有利地位,并补充说,元宇宙在法律上不会免受新规则的影响,即将出台的《在线安全法案》足以应对元宇宙平台和公司,届时违法行为一旦获得批准,可能会被处以高达全球年收入10%的罚款。[2022/10/26 11:45:39]

contractMyContract{uint256publicconstanthasInitialValue=42;//defineasconstant}

从合约代码中创建新实例

当从合约代码中创建一个新的合约实例时,这些创建直接由Solidity处理,而不是由OpenZeppelinUpgrades处理,这意味着这些合约将无法升级。

例如,在下面的例子中,即使MyContract被部署为可升级,创建的token合约也是不可升级的:

//contracts/MyContract

}

潜在的不安全操作

在使用可升级的智能合约时,你将始终与合约实例进行交互,而不是底层逻辑合约。然而我们却无法阻止恶意行为者直接向逻辑合约发送交易。这不会构成威胁,因为逻辑合约状态的任何变化都不会影响你的合约实例,因为你的项目中从未使用过逻辑合约的存储。

然而,有一个例外。如果对逻辑合约的直接调用触发了自毁操作selfdestruct,那么逻辑合约就会被销毁,你的所有合约实例最终都会将所有的调用委托给一个地址,而不会有任何代码。这会破坏你项目中的所有合约实例。

如果逻辑合约中包含委托调用delegatecall操作,也可以达到类似的效果。如果可以将delegatecall变成一个包含自毁的恶意合约,那么调用合约将被破坏。

因此,在你的合约中不允许使用selfdestruct或delegatecall。

修改你的合约

在编写新版本的合约时,无论是由于新功能还是bug修复,都有一个额外的限制需要遵守:你不能改变合约状态变量的声明顺序,也不能改变它们的类型。你可以通过了解Proxies来阅读更多关于这个限制背后的原因。

警告违反这些存储布局限制中的任何一项,都会导致升级版的合约的存储值被混淆,并可能导致你的应用程序出现关键错误。这意味着,如果初始合约看起来像这样:

contractMyContract{uint256privatex;stringprivatey;}

那么不可以修改合约变量类型:

contractMyContract{stringprivatex;stringprivatey;}

也无法改变变量的声明顺序:

contractMyContract{stringprivatey;uint256privatex;}

不能在现有变量之前引入新的变量:

contractMyContract{bytesprivatea;uint256privatex;stringprivatey;}

也不能删除现有变量:

contractMyContract{stringprivatey;}

如果需要引入新的变量,请确保添加到原有变量的后面:

contractMyContract{uint256privatex;stringprivatey;bytesprivatez;}

注意,如果重命名一个变量,那么在升级后,它将保持与之前相同的值。如果新变量和旧变量的语义相同,那么这可能是我们所希望的行为:

contractMyContract{uint256privatex;stringprivatez;//startswiththevaluefrom`y`}

而如果你在合约的最后删除了一个变量,请注意存储不会被清除。随后的更新中如果增加一个新的变量,会导致该变量从被删除的变量中读取遗留的值:

contractMyContract{uint256privatex;}

升级到:

contractMyContract{uint256privatex;stringprivatez;//startswiththevaluefrom`y`}

注意,你也可能会因为改变合约的父合约而无意中改变合约的存储变量。例如,如果你有以下合约:

contractA{uint256a;}contractB{uint256b;}contractMyContractisA,B{}

然后通过调换基础合约的声明顺序或引入新的基础合约来修改MyContract,将改变变量的实际存储方式:

contractMyContractisB,A{}

如果集成合约有任何自己的变量,你也不能在基础合约中添加新的变量。鉴于以下情况:

contractBase{uint256base1;}contractChildisBase{uint256child;}

如果修改Base,增加一个额外的变量:

contractBase{uint256base1;uint256base2;}

然后,变量base2将被分配到上一个版本中那个child的槽位。一个变通的办法是在基础合约上声明未使用的变量,你可能会在未来想要扩展,作为"保留"这些槽位的一种手段。请注意,这个技巧不会增加gas使用量。

请戳↓“阅读原文”↓获取文中链接

免责声明:作为区块链信息平台,本站所发布文章仅代表作者个人观点,与链闻ChainNews立场无关。文章内的信息、意见等均仅供参考,并非作为或被视为实际投资建议。

本文来源于非小号媒体平台:

登链社区

现已在非小号资讯平台发布105篇作品,

非小号开放平台欢迎币圈作者入驻

入驻指南:

/apply_guide/

本文网址:

/news/9579149.html

免责声明:

1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险

2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场

上一篇:

币安为何推出第三条链?这对BNB意味着什么?

标签:CONTRAACTONTecon币种UltraFractalONTC

MANA热门资讯
OOKS:美国为数字货币机构发出第一张许可证 比特币上涨13%丨币鑫

比特币价格周一大跌之后,价格连续三日走出反弹,24小时内涨幅达13%,价格目前运行于37545附近.

1900/1/1 0:00:00
BBK:BBKX关于fil3交割事宜的公告

亲爱的BBKX用户您好,fil3期货将于2020年1月13日15-16点执行到期交割。届时,fil3币种下架,fil3相关币对挂单自动撤单。fil3将全部转化成fil,您可以通过资产列表查看.

1900/1/1 0:00:00
数字人:国家支持的中国农业银行推出首批数字人民币自动柜员机

中国“四大”银行之一的中国农业银行正在启动一项试点计划,以启用首批数字人民币ATM。该银行机构在深圳的部分分行部署了第一批机器.

1900/1/1 0:00:00
比特币:谈喻凯:报复性回调寻良机 比特币以太坊操作建议及解套

正所谓“期望越大,失望也越大”,当你对市场抱有希望的时候,市场难免也会给你失望的感觉,就像昨日的数字货币市场,主流币集体暴跌,你总是期盼着上涨,但是它还是越跌越凶,开弓之箭,没有回头之路.

1900/1/1 0:00:00
USD:关于ETF部分币种份额合并名单调整的公告

尊敬的客户:由于当前部分ETF产品的价格过低,为提高其价格变化的灵敏度,优化交易体验,链上云将在2021年1月12日00:00-06:00期间.

1900/1/1 0:00:00
比特币:比特币矿工的喜与忧:矿机价格与币价齐飞 担心暴跌再来

2017年冬天,内蒙古的夜很冷,室外温度低于零下20摄氏度。在一座荒凉的“矿场”里,由于没有什么娱乐活动,来自浙江杭州的比特币矿工冯胜在“上下铺式,能睡七八个人”的大房间里早早睡去.

1900/1/1 0:00:00