详解转账与函数调用

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
    在这里插入图片描述
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值