链闻ChainNews:
Solidity是以太坊上最主流的函数修改器。本篇文章从技术角度展示了如何针对异常情况在代码层面进行详细分析,最后总结出异常情况最易出现的一些场景,并给出相对应的建议。
来源|矩阵数字经济智库作者|闫莺等
函数修改器
Solidity提供了一个函数修改器的特性。函数修改器与Python中的装饰器类似,可以在一定程度上改变函数的行为,比如可以自动在函数执行前检查参数是否合法。函数修改器是可以被继承的,同时可以被派生类覆盖重写。
下面代码展示了如何声明并使用函数修改器。
contractowned{functionowned(){owner=msg
以太坊客户端Geth发布v1.11.5版本,以能在4月13日启用上海主网升级:3月21日消息,Go Ethereum发布以太坊客户端Geth v1.11.5版本(Erszbat),Geth v1.11.5将在UTC时间4月12日22:27:35(北京时间4月13日06:27:35)启用上海主网升级。
此前3月16日消息,以太坊主网将于4月12日进行上海(Shapella)升级。[2023/3/21 13:17:06]
addressowner;//这个合约定义了一个在派生合约中使用的函数修改器//";"指代被修改函数的函数体。//当这个函数执行前,先检查msg
}contractContractisowned{//从owned合约继承了onlyOwner函数修改器并且将其作用于close函数//确保了这个函数只有在调用者为合约创建者时才会生效functionclose()onlyOwner{selfdestruct(owner);}}
以太坊桥TVL达到236.3亿美元:金色财经报道,Dune Analytics数据显示,以太坊桥当前TVL达到236.3亿美元。其中锁仓量最高的5个桥分别是AvalancheBridge(59.05亿美元)、PolygonBridges(51.43亿美元)、FantomAnyswapBridge(44.38亿美元)、RoninBridge(30.79亿美元)、ArbitrumBridges(30.43亿美元)。[2022/2/28 10:19:49]
下面代码进一步展示了函数修改器是如何接收参数的,函数修改器的参数可以是上下文中存在的任意变量组成的表达式。
contractpriced{//函数修改器可以接收参数modifiercosts(uintprice){if(msg
以太坊L2网络总锁仓量超60亿美元:金色财经报道,L2BEAT数据显示,截至1月5日,以太坊Layer2上总锁仓量为60.2亿美元。其中锁仓量最高的为扩容方案Arbitrum,约28.1亿美元,占比46.81%。其次是dYdX,锁仓量9.75亿美元,占比16.2%。[2022/1/5 8:26:16]
}}contractRegisterispriced,owned{mapping(address=>bool)registeredAddresses;uintprice;functionRegister(uintinitialPrice){price=initialPrice;}//这里需要payable修饰词,否则无法通过该方法转账以太币//函数修饰器costs接收参数price//使用costs修饰器确保registe函数在msg
以太坊全网算力约676,172.20 GH/s:据以太坊链上数据显示,当前以太坊全网算力约676,172.20 GH/s,挖矿难度约9,061.78T。交易费Gas均价为351.00Gwei,未确认交易数为127105。[2021/9/25 17:05:31]
functionchangePrice(uint_price)onlyOwner{price=price;}}
下面的例子展示了如何使用函数修改器实现一个重入锁机制。
contractMutex{boollocked;modifiernoReentrancy(){require(!locked);locked=true;;locked=false;}//这个函数使用了noReentrancy修改器,这保证了在f函数内部无法再次调用f函数//在执行return7时也执行了函数修改器中的locked=false语句functionf()noReentrancyreturns(uint){require(msg
动态 | 以太坊总交易额达到236.31万ETH 较昨日下降19.11%:根据amberdata.io数据显示,过去24小时内以太坊总交易额达到292.02万ETH,较此前数据下降19.11%;日活跃用户量138233,用户活跃下降6.06%;新增合约5474个,较此前数据下降56.95%;平均交易费用达18.82 GWEI,上涨15.29%;通证代币交易总额为370137,较此前数据相比下降了20.53%。[2019/3/1]
}异常处理以太坊使用状态回退机制处理异常。如果发生了异常,当前消息调用和子消息调用产生的所有状态变化都将被撤销并且返回调用者一个报错信号。Solidity语言提供了两个方便的函数assert和require来检查条件,并且当条件不满足的时候抛出一个异常。assert函数通常用于检查变量和内部错误,require函数用于确保程序执行的必要条件是成立的。一个正常运行的程序不应该遇到assert和require失败,否则程序代码中一定存在需要修复的问题。revert函数和throw关键词会标识发生了错误并且回退当前的消息调用产生的状态改变。当前调用收到子消息调用产生的异常时会自动抛出,所以异常会一层层上浮直到最上层的根调用,代码会立刻终止执行并回退状态改变。但是,
}
一个assert类型的异常会在下述场景抛出:
访问数组越界,下标为负数或者超出长度。访问固定长度的bytesN越界,下标为负数或者超出长度。对0做除法或者对0取模,比如5/0,5%0。移位操作使用了一个负数做操作数。转换一个特别大的数或者负数到枚举类型变量。使用移位操作时给一个负数值。使用枚举时将过大值或赋值转为枚举类型变量。调用assert函数并且参数值为false。一个require类型的异常会在下述场景抛出:
调用throw。调用require并且参数值为false。发起一个消息调用,但是这个调用没有正常完成,比如Gas耗尽、被调用函数不存在或者函数本身抛出一个异常。使用new创建一个合约,但是和3中提到的原因一样构造函数没有正常完成。调用外部函数时指向一个不包含代码的地址。合约通过一个没有payable修辞词的函数接收以太币,包括构造函数和fallback函数。合约通过一个公开的访问函数接收以太币。.transfer()失败。在require类型的异常发生时会执行回退操作,对于一个assert类型的异常执行一个无效操作。在这两种情况下,以太坊虚拟机都会撤销所有的状态改变。这样做是因为发生了意料之外的情况,交易无法安全执行下去,为了保证交易的原子性,最安全的操作就是撤销该交易对状态造成的影响。
在编写合约代码时,我们需要合理使用assert和require来保证代码能够按我们预期的设计进行。
更多精彩内容,关注链闻ChainNews公众号,或者来微博**@链闻ChainNews**与我们互动!转载请注明版权和原文链接!
来源链接:mp.weixin.qq.com
本文来源于非小号媒体平台:
链闻研究院
现已在非小号资讯平台发布1篇作品,
非小号开放平台欢迎币圈作者入驻
入驻指南:
/apply_guide/
本文网址:
/news/3626956.html
以太坊ETH
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表非小号的观点或立场
上一篇:
文摘|Schnorr签名:比特币的最新升级
标签:RICEICEPRIOWNFrax Price Index Sharealice币价格PrimitiveCrown Sovereign
04月11日凌晨00:17,PeckShield态势感知平台监测到TCX1Cay…开头的黑客,创建了名为BTTx,tokenid为1002278的TRC10token.
1900/1/1 0:00:00原文阅读时长8分钟:如何在10分钟内免受比特币盗窃如果您不了解保护比特币的最佳做法,那么有很多漏洞导致您的比特币丢失.
1900/1/1 0:00:00近期币圈前十大主流币种裹足不前,而小市值币种matic补涨13倍,以及大家特别关注看空的弃婴BSV狂拉210%。这一情况当时让很多人都摸不清头脑,一次性爆发突飞猛涨,将近130多个点位.
1900/1/1 0:00:00如图,ETH日线从去年10月至目前将近8个月的时间走出一个大的圆弧底形态,币价在最低下探触及80美元后触底反弹,并一直处于上行趋势线上方运行,我们发现ETH每次触碰该趋势线获得稳固支撑后.
1900/1/1 0:00:00任何一个经济体制都没有办法完全抑制资本的存在。文卢晓明出品|Odaily星球日报2019年,牛市未来,但区块链项目和技术在逐步推进.
1900/1/1 0:00:00进入4月以来,比特币从4000刀一路向上突破,各个阻力位仿佛不存在似的。目前比特币已经冲破8000大关,还引来了主流媒体和股民的关注,币圈已经很久没有这么振奋人心的时刻了.
1900/1/1 0:00:00