木星链 木星链
Ctrl+D收藏木星链

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

作者:

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

链闻ChainNews:

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

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

函数修改器

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

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

contractowned{functionowned(){owner=msg

以太坊未确认交易为216,171笔:金色财经消息,据OKLink数据显示,以太坊未确认交易216,171笔,当前全网算力为745.15TH/s,全网难度为10.08P,当前持币地址为66,696,202个,同比增加221,078个,24h链上交易量为2,294,787ETH,当前平均出块时间为13s。[2021/10/31 6:22:21]

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

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

Ternio已决定销毁Stellar链上的1亿枚TERN 将其转移至以太坊发行:加密货币项目Ternio(TERN)背后的团队已决定销毁Stellar链上的1亿枚TERN,并将这部分代币转移至以太坊区块链,这表明该项目正在部分抛弃Stellar。(News Logical)[2020/6/26]

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

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

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

以太坊开发公司CasperLabs计划与BitMax合作推出PoS区块链:根据最新公告,以太坊开发公司CasperLabs计划与新加坡加密交易所BitMax合作推出自己的PoS区块链。BitMax将托管CasperLabs的交易验证程序产品(EVO),并允许散户投资者持有该网络的CLX代币。(Cointelegraph)[2020/4/8]

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

声音 | 分析师:以太坊突破200美元只是增长的开始:加密货币分析师Josh Rager日前在推特上表达了自己对ETH的看涨情绪:“待到两年后,我们将回顾并讨论200美元以下的ETH真可谓是一份大礼。”另一位分析师JohnLiv对此表示赞同,他预计到2020年底,ETH价格将达到400美元。但在短期内,他预计ETH将面临下一个重大考验——在240美元时,其上行动能将被打破。但和Josh Rager一样,JohnLiv长期看好ETH。(NewsBTC)[2020/2/7]

}异常处理以太坊使用状态回退机制处理异常。如果发生了异常,当前消息调用和子消息调用产生的所有状态变化都将被撤销并且返回调用者一个报错信号。Solidity语言提供了两个方便的函数assert和require来检查条件,并且当条件不满足的时候抛出一个异常。assert函数通常用于检查变量和内部错误,require函数用于确保程序执行的必要条件是成立的。一个正常运行的程序不应该遇到assert和require失败,否则程序代码中一定存在需要修复的问题。revert函数和throw关键词会标识发生了错误并且回退当前的消息调用产生的状态改变。当前调用收到子消息调用产生的异常时会自动抛出,所以异常会一层层上浮直到最上层的根调用,代码会立刻终止执行并回退状态改变。但是,

行情 | 以太坊未确认交易笔数为21899笔:根据公开数据显示,目前以太坊的网络未确认交易笔数为21899笔,网络拥堵程度一般。[2018/7/14]

}

一个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币挖矿flokiceo币是什么币PRIMATEiOWN Token

芝麻开门交易所下载热门资讯
稳定币:稳定币3.0报告——新的历史使命和竞争格局

稳定币是指与法币的兑换比例保持相对稳定的类似“货币”的一般等价物。因为法币与商品和服务之间的兑换比例相对稳定,因此稳定币的最终锚定对象是商品和服务,也就是实际的购买力.

1900/1/1 0:00:00
EOS:条条大路通罗马:实现数字货币双花攻击的多种方法

2008年,中本聪提出了一种完全通过点对点技术实现的电子现金系统。该方案的核心价值在于其提出了基于工作量证明的解决方案,使现金系统在点对点环境下运行,并能够防止双花攻击.

1900/1/1 0:00:00
COM:ZT.COM的创新之作:颠覆传统 共识上币

为了满足ZT用户交易需求,ZT.COM结合了众多用户及项目方的意见反馈。为了给用户提供更多优质的项目,促进行业的健康发展和生态发展。ZT.COM将开启“共识上币”的活动,每月将会进行一到两场.

1900/1/1 0:00:00
AMP:加密市场对于“AT&T是否完全算是接受比特币”引发争论

针对“美国电信巨头AT&T宣布将通过BitPay接受加密货币支付账单”的消息,加密社区的反应各不相同.

1900/1/1 0:00:00
ZIP:创新金融转接支付如何实现通证“货币化”

Token支付9年前,一位名叫LaszloHanyecz的程序员在比特币论坛上用一万枚比特币支付了两份PapaJohn’s的大披萨.

1900/1/1 0:00:00
MPL:一文看懂Bitfinex首个IEO项目Ampleforth

近日,数字货币交易所Bitfinex及其旗下交易平台Ethfinex宣布推出新的IEO交易平台Tokinex.

1900/1/1 0:00:00