付费视频,请购买课程( ¥2,000.00 )后再观看

Solidity 进阶:ABI 与底层调用 Call/Delegatecall

11次播放
8小时前

视频 AI 总结: 视频深入探讨了以太坊智能合约的ABI(应用二进制接口)及其底层调用。ABI定义了合约接口,将函数调用编码为链上可识别的二进制数据(函数签名哈希前四字节加参数)。视频重点介绍了Solidity中的两种底层调用:calldelegatecallcall允许通过ABI编码灵活调用任意函数,且在转账时优于有gas限制的transfer方法。delegatecall则更为高级,它在执行目标合约代码时能保持调用者的上下文(msg.sendermsg.value不变),并在当前合约的存储中执行,是实现代理模式的关键。

关键信息:

  1. ABI (Application Binary Interface):用于描述合约接口,将函数调用(包括函数签名和参数)编码为链上可识别的二进制数据。函数签名通过哈希函数名和参数类型,取前四个字节得到。
  2. 交易类型:分为普通转账(无附加数据)、合约创建(传递字节码和参数)和合约调用(传递ABI编码数据)。
  3. call底层调用
    • 允许通过ABI编码灵活调用合约的任何函数,类似于编程语言中的反射机制。
    • 在进行以太币转账时,call方法没有transfer方法的2300 gas限制,因此是推荐的转账方式(transfer被视为技术债)。
    • 调用失败时,call会返回一个布尔值(success)和返回数据,而不会自动回滚交易,需要开发者手动检查返回值以确保安全性。
    • call会切换上下文,即被调用合约中的msg.sender会变为调用它的合约地址。
  4. delegatecall委托调用
    • call最主要的区别在于它“保持上下文”,即被调用合约中的msg.sendermsg.value会保持为原始的外部调用者(EOA或最初的合约)。
    • delegatecall会借用目标合约的代码,但在当前合约的存储和上下文中执行,这意味着状态改变会发生在调用delegatecall的合约上。
    • 它是实现代理合约(Proxy Pattern)和可升级合约的关键机制。
  5. address类型的方法:包括balancecodecalldelegatecallstaticcall。其中staticcall用于调用不修改状态的函数(类似view)。