详解转账与函数调用

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
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37117521/article/details/140501010