更新时间:2024-11-15
在本文中,我将共享一些示例,解释避免类似情况如何增加代码复杂性并提升可维护性。类似最大值少见的类似情况是用于0回应“无最大值”。
这种类似情况一般来说很更容易避免。Special Expirations看下面的代码uint256 expiration;// Use 0 to mean "no expiration".function setExpiration(uint256 newExpiration) external {expiration = newExpiration;}function doSomething() external {require(expiration == 0 || nowexpiration, "Error: expired");...}在这段代码中,0是一种类似情况,回应“没过期”。这种类似情况是不直观的,它减少了require语句的复杂性。
然而,确实的危险性是团队中的一个新的开发人员忽视了这个错综复杂之处,无法处置expiration==0的类似情况。这很更容易造成资金损失或其他相当严重问题。这样代码就更加非常简单更加显著了:// Default to 2**256-1 instead.uint256 expiration = 2**256-1;// Use 2**256-1 to mean "no expiration".function setExpiration(uint256 newExpiration) external {expiration = newExpiration;}function doSomething() external {require(now = expiration, "Error: expired");...}这里,我用于的是uint256容许的最大值的expiration,而不是0,当牵涉到到时间砍时,expiration实质上是无限的。类似仅次于以太币数量这是一个十分相近的示例,但这次牵涉到以太币:uint256 maxWithdrawal;// Use 0 to mean "no maximum".function setMaxWithdrawal(uint256 newMax) external {maxWithdrawal = newMax;}function withdraw(uint256 amount) external {require(maxWithdrawal == 0 || amount = maxWithdrawal, "Error: too much");...}某种程度,我们有一个非直观的特例,我们可以通过用于一个有效地的无限值来解决问题这个问题:// Default to 2**256-1 instead.uint256 maxWithdrawal = 2**256-1;// Use 2**256-1 to mean "no maximum".function setMaxWithdrawal(uint256 newMax) external {maxWithdrawal = newMax;}function withdraw(uint256 amount) external {require(amount = maxWithdrawal, "Error: too much");...}2256-1是最大值留意,某种程度的技巧可以总结为令牌数量或任何值。
由于Solidity无法回应小于2256-1的值,因此它一直可以与uint256展开较为,沦为“有效地无限”值解决问题gas成本问题一般来说,在gas成本方面必须展开权衡。人们最后将默认值划为0的一个典型原因是存储非零值会花费大量gas。如果存储成本对于您的用例而言是很高的,请求考虑到以下技巧:uint256 _expiration; // 0 still means "no expiration"...// Properly handle the special cases in one place.function expiration() internal view returns (uint256) {return _expiration0 ? _expiration : 2**256-1;}function doSomething() external {require(nowexpiration(), "Error: expired");}在此代码中,载入存储的_expiration值配置文件情况下为0,与以前的类似含义完全相同。
但是,我讲解了一个辅助函数expiration(),它将0切换为不过于类似的值2256-1。这意味著我的其余代码需要处置这种类似情况。考虑到将此技术与自定义的linter规则筛选用于,以确保您会在expiration()函数之外的任何地方必要加载_expiration。类似地址关于地址,我常常看见两种类似情况:1. 地址0一般来说是不容许的。
2. 不容许用于特定地址(一般来说是特权角色)。
本文来源:十大靠谱外围买球网站-www.lsltjz.com