抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

1. 自定义错误类型

这是在solidity 0.8.4新加的内容,方便且高效(省gas)地向用户解释操作失败的原因,同时还可以在抛出异常的同时携带参数,帮助开发者更好地调试。

在执行中,error必须搭配revert使用。

自定义错误:

1
error InsufficientBalance(address requested, uint256 available);

两种调用方式:

1
2
3
4
5
6
function send1(address payable to, uint256 amount) public {
if (address(this).balance < amount) {
revert InsufficientBalance({requested: to, available: amount});
}
to.call{value: amount}("");
}
1
2
3
4
5
6
function send2(address payable to, uint256 amount) public {
if (address(this).balance < amount) {
revert InsufficientBalance(to, amount);
}
to.call{value: amount}("");
}

2. 辅助函数

这是一种定义在合约之外的一种函数,没有publicprivateinternalexternal这些关键词修饰。调用的方式为:直接通过函数名调用即可。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 定义在合约之外的辅助函数
function helper(uint x) pure returns (uint) {
return x * 2;
}

contract Test {

uint256 public a = 1;

function test() public {
a = helper(a) << 3;
}
}

调用一次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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
contract DistinguishCaller {


// 该调用方式的caller, 为msg.sender
function callCommon() public {
callFunc();
}


// 该调用方式的caller, 为address(this)
function callLow() public {

bytes memory paylaod = abi.encodeWithSelector(this.callFunc.selector);
(bool ok, ) = address(this).call(paylaod);
require(ok);

}

// 该调用方式的caller, 为address(this)
function callThis() public {
this.callFunc();
}

function callFunc() public {
address caller = msg.sender;
console.log("call=>", caller);
}

}

image-20240227145114871

5. 低版本发送gas和value

1
2
3
4
// 调用外部合约函数
// 这里一定需要带两个小括号,第一个括号填数值,第二个k
contract.function.gas()();
contract.function.value()();

评论



政策 · 统计 | 本站使用 Volantis 主题设计