receive()函数
单纯转账calldata为空,为了使得fallback的职责清晰,solidity安排了另一个特殊函数receive()来处理它。
被调用函数解析逻辑
检查逻辑
解析逻辑如果成功则会输出一个函数,检查逻辑就是检查一个情况:
- value>0 并且 这个函数没有被payble修饰。
如果出现这个情况,调用失败终止,否则执行函数逻辑
这就是payable修饰符在函数定义中的作用
转账系统的遗留方式
- Solidity中的转账函数send和transfer是旧的转账设计,有各种缺陷
- 新的转账设计没有专门的转账函数,而是普通函数调用的伴生物
- send和transfer就是gaslimit为2300的calldata为空的call,区别在于transfer处理了call的返回值
- 建议使用新的转账设计
边界性问题
- 调用非合约地址的合约函数总是成功
- 非合约地址并非一定是外部账号,地址空间是黑暗森林
- 合约不一定能接收资产,接收了资产也不一定能够转出资产
地址的checksum
- Address的使用中如果有输入错误是非常危险的,地址进入黑暗森林,资产进入黑洞
- Checksum保证了输入错误能够被检查出来
- Checksum检查是在链下完成的,比如在ethersjs这种js包中完成,链上并不会检查checksum