火星链 火星链
Ctrl+D收藏火星链

ICE:以太坊技术 | Solidity 函数修改器以及异常处理

作者:

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

链闻ChainNews:

Solidity是以太坊上最主流的函数修改器。本篇文章从技术角度展示了如何针对异常情况在代码层面进行详细分析,最后总结出异常情况最易出现的一些场景,并给出相对应的建议。

来源|矩阵数字经济智库作者|闫莺等

函数修改器

Solidity提供了一个函数修改器的特性。函数修改器与Python中的装饰器类似,可以在一定程度上改变函数的行为,比如可以自动在函数执行前检查参数是否合法。函数修改器是可以被继承的,同时可以被派生类覆盖重写。

下面代码展示了如何声明并使用函数修改器。

contractowned{functionowned(){owner=msg

数据:超5000枚DeGods已完成从Solana到以太坊迁移:金色财经报道,从美东时间本周五晚间9:30开始,目前已有超5000枚DeGods NFT完成了从Solana区块链到以太坊的迁移,相关公告称,Dust Labs将承担并支付启动迁移后24小时内所有与迁移相关的gas费用。另据加密KOL @Frankdegods透露,首个迁移到以太坊的DeGods NFT已经以11.1 ETH的价格售出,OpenSea数据显示,当前DeGods地板价为9.555 ETH。[2023/4/2 13:40:28]

addressowner;//这个合约定义了一个在派生合约中使用的函数修改器//";"指代被修改函数的函数体。//当这个函数执行前,先检查msg

}contractContractisowned{//从owned合约继承了onlyOwner函数修改器并且将其作用于close函数//确保了这个函数只有在调用者为合约创建者时才会生效functionclose()onlyOwner{selfdestruct(owner);}}

以太坊未确认交易为218,356笔:金色财经消息,据OKLink数据显示,以太坊未确认交易218,356笔,当前全网算力为745.48TH/s,全网难度为10.11P,当前持币地址为66,826,312个,同比增加191,379个,24h链上交易量为1,328,897ETH,当前平均出块时间为13s。[2021/11/1 21:13:32]

下面代码进一步展示了函数修改器是如何接收参数的,函数修改器的参数可以是上下文中存在的任意变量组成的表达式。

contractpriced{//函数修改器可以接收参数modifiercosts(uintprice){if(msg

}}contractRegisterispriced,owned{mapping(address=>bool)registeredAddresses;uintprice;functionRegister(uintinitialPrice){price=initialPrice;}//这里需要payable修饰词,否则无法通过该方法转账以太币//函数修饰器costs接收参数price//使用costs修饰器确保registe函数在msg

以太坊核心开发者:测试网Rinkeby即将开启柏林硬分叉:以太坊核心开发者PéterSzilágyi表示,测试网Rinkeby 将于3月24日开启柏林硬分叉. 任何没有更新的节点将停止同步,因为所有的签名者都已经更新了。因此所有没有更新的节点在统计页面上会变成红色,鉴于2/3没有升级,统计页面的大部分会变成红色,在节点停止同步之前,最后一次呼吁更新你的节点,此前报道,测试网Rinkeby将于3月24日(区块高度8,290,928)开启。[2021/3/24 19:12:11]

functionchangePrice(uint_price)onlyOwner{price=price;}}

下面的例子展示了如何使用函数修改器实现一个重入锁机制。

数据:以太坊地址数量达4600万,约67.3%的用户处于盈利状态:据intotheblock数据显示,拥有余额的以太坊的地址数量目前已达到4600万个,这意味着过去9个月的时间,全网以太坊地址数量增加1200万。同时,全网有67.3%、约3100万的以太坊地址拥有的加密货币资产是处于盈利的状态。[2020/9/10]

contractMutex{boollocked;modifiernoReentrancy(){require(!locked);locked=true;;locked=false;}//这个函数使用了noReentrancy修改器,这保证了在f函数内部无法再次调用f函数//在执行return7时也执行了函数修改器中的locked=false语句functionf()noReentrancyreturns(uint){require(msg

5月25日以太坊链上USDT转账数量超20万笔,创历史新高:据以太坊浏览器显示,5月25日以太坊链上ERC20-USDT转账数量创下单日历史新高,达到了208107笔。

此前的单日转账数量最高纪录是2019年9月9日,当时一天共有188621笔ERC20-USDT转账。据了解,Tether也是以太坊链上Gas的最大消耗者之一。[2020/5/26]

}异常处理以太坊使用状态回退机制处理异常。如果发生了异常,当前消息调用和子消息调用产生的所有状态变化都将被撤销并且返回调用者一个报错信号。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签名:比特币的最新升级

标签:RICEICEPRIOWNrice币挖矿Giving To ServicesOctavus PrimeIOWN

抹茶交易所热门资讯
ETH:黑色星期五来临,BTC能否在本轮上涨中翻盘?

截至今日8点,以太坊合约精英账户中,多头平均持仓比例为19.28%,空头平均持仓比例为16.00%,多头占优且多空持仓比例差距增大.

1900/1/1 0:00:00
AOL:主力诱空还是大跌的开始?

本文观点仅代表个人,仅限交流学习,所有内容不构成任何投资建议。想及时了解更多行情信息,请添加官方微信进群:jiamibaoluo。昨天文章提到的HT有机会,昨晚就已经直线拉升.

1900/1/1 0:00:00
ONE:DragonEx 新增 XMR/USDT 杠杆交易对

DragonEx新增XMR/USDT杠杆交易对2019-05-23亲爱的用户:DragonEx将于2019年5月23日15:00(UTC8)对XMR/USDT交易对开启杠杆交易功能.

1900/1/1 0:00:00
USDT:FOne新币上线公告 【2019-05-23】

亲爱的社区用户:应FOne蜂巢资本交易区要求,FOne?会在今日?20:00开始支持以下币种交易:DAI(DAI).

1900/1/1 0:00:00
ANK:区块链版 PornHub 智能合约惨遭黑客攻击 4 万美元一扫而空

作者:VictorFangWholetthespankhurt?据Coindesk消息,数字货币项目SpankChain称其在周六下午18:00左右遭受了黑客攻击,损失了165.38ETH.

1900/1/1 0:00:00
SEAL:英特尔 SGX L1TF 漏洞修复更新 BIOS 步骤

漏洞描述英特尔近日公布了三个被称为L1TF漏洞:L1TF–SGX>>>CVE-2018-3615.

1900/1/1 0:00:00