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

链闻ChainNews:

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

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

函数修改器

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

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

contractowned{functionowned(){owner=msg

区块链忠诚度奖励平台Crowny已迁移至Solana:1月18日消息,区块链忠诚度奖励平台Crowny宣布已成功迁移至Solana。用户可以在顶峰AscendEx进行CRWNY SPL代币充提。[2022/1/18 8:57:35]

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

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

去中心化交易所CrownSwap通过Certik安全审计:据悉,去中心化交易所CrownSwap已经通过美国知名安全审计公司Certik代码审计,CrownSwap首创单边流动性提供机制,有着创新的经济激励模型和成熟的技术团队,在V2版本上线后,日交易额已经突破1700万美金。[2021/12/9 13:00:28]

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

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

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

万卉:黑客会把NXM换成wNXM,wNXM持有者只能眼睁睁看着被砸盘:针对今晚Nexus Mutual创始人被黑客盗走800多万美元NXM事件,Primitive Ventures创始合伙人万卉发布微博表示,黑客会将NXM换成wNXM,wNXM持有者只能眼睁睁看着被砸盘,以下为微博原文:

NXM被黑的填坑部分我单独发一下:再次感叹整个Defi食物链的顶端,真的是黑客/科学家们。。。 黑掉Nexus Mutual的黑客不仅拿到了Huge Karp的电脑的远程控制(呃,Karp可能用的是Windows? MacOS上会被恶意远程控制的漏洞很少) ,为了收割Karp手上NXM还去做了Nexus Mutual的KYC (已经精心准备了很久,可见有KYC也没啥用) 黑的过程其实比较常见,就是trick Karp去签了一个看似正常的交易,但是实际的交易是把币发给了自己。

因为Karp手上肯定没有大量的wNXM而是有大量的NXM,所以必须要在内盘内完成“钓鱼”的工作。然后钓鱼完成后,NXM本身的价格只要跌到了MCR100%的时候,黑客必然知道无法靠Bonding curve出货,所以非常老练的直接把拿到的NXM wrap掉,去外部砸盘。

现在NXMwNXM是个单向的流通:wNXM的持有者无法拿着wNXM去赎回NXM,原来在MCR>100%以上的时候,只要wNXM价格低于NXM本身,外盘的wNXM持有者可以赎回NXM回到内盘在Bonding Curve上卖掉。但是现在MCR=100%的时候,相当于这个口子卡死了,虽然NXM可以卡在MCR=100%的这个价格上,但是wNXM无法赎回。所以现在wNXM的持有人只有躺着被黑客砸盘,没有任何办法... 心疼拿着wNXM的老铁,还有给wNXM在AMM上做市的LP。[2020/12/15 15:11:28]

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

数据:以太坊上DeFi协议总锁仓量突破500亿美元:据欧科云链OKLink数据显示,截至今日15时,以太坊上DeFi协议总锁仓量约合502.68亿美元,锁仓量已突破500亿美元。

其中锁仓量排名前三的协议分别是Maker?62.42亿美元,Compound?44.46亿美元以及Curve?42.24亿美元。[2021/2/9 19:19:32]

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

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

以太坊匿名解决方案 ZeroPool 推出早期测试版:以太坊匿名解决方案 ZeroPool 推出早期测试版,但其开发者 Igor Gulamov 提醒到,这是非常早期的版本,很多部分尚未实现,而实现的部分尚未经过完整的测试,但还是可以运行的,开发者可以对合约进行测试或查看演示视频。团队表示 ZeroPool 是一个高级的隐私解决方案,比其他混币工具更好,用户可以使用它对任何外部的观察者隐藏数量、资金来源和目标地址,储存或执行 ETH 和其他任何 ERC-20 代币的兑换。ZeroPool 将包含两部分,集合了零知识证明(ZKP)和未花费的交易输出(UTXO)的智能合约,以及使用 BabyJubJub 椭圆曲线生成的公私钥对的 Chrome 浏览器插件钱包。该项目最早起源于 ETH Boston 的黑客松活动中,并获得过 ConsenSys 的 2.5 万美元资助。[2020/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签名:比特币的最新升级

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

链链资讯

[0:5ms0-4:334ms