1. 自定义错误类型
这是在solidity 0.8.4
新加的内容,方便且高效(省gas
)地向用户解释操作失败的原因,同时还可以在抛出异常的同时携带参数,帮助开发者更好地调试。
在执行中,error必须搭配revert使用。
自定义错误:
1 | error InsufficientBalance(address requested, uint256 available); |
两种调用方式:
1 | function send1(address payable to, uint256 amount) public { |
1 | function send2(address payable to, uint256 amount) public { |
2. 辅助函数
这是一种定义在合约之外的一种函数,没有public
,private
,internal
,external
这些关键词修饰。调用的方式为:直接通过函数名调用即可。
示例:
1 | // 定义在合约之外的辅助函数 |
调用一次test()函数之后,a的值应该变成16。
3. uint和bytes的截取方式
以转address类型为例:
如果使用较大字节的类型转换为 address
,例如 bytes32
,那么 address
就被截断了。 为了减少转换的模糊性,从 0.4.24 版本开始,编译器将强迫在转换中明确地进行截断处理。以32字节的值 0x111122333344556677888899AAAABBBBCCCCDDDDEEFFFFCCCC
为例。
可以使用 address(uint160(bytes20(b)))
,结果是 0x111122223333444455556666777788889999aAaa
, 或者可以使用 address(uint160(uint256(b)))
,结果是 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc
。
4. 分清caller
solidity官方文档上,有这样一段话:
所有这些函数都是低级别的函数,应该谨慎使用。 具体来说,任何未知的合约都可能是恶意的,如果您调用它, 您就把控制权交给了该合约,而该合约又可能回调到您的合约中, 所以要准备好在调用返回时改变您合约的状态变量。 与其他合约互动的常规方法是在合约对象上调用一个函数(
x.f())。
举例:
1 | contract DistinguishCaller { |
5. 低版本发送gas和value
1 | // 调用外部合约函数 |