付费视频,请购买课程( ¥2,000.00 )后再观看
Solidity 进阶:ABI 与底层调用 Call/Delegatecall
11次播放
8小时前
视频 AI 总结:
视频深入探讨了以太坊智能合约的ABI(应用二进制接口)及其底层调用。ABI定义了合约接口,将函数调用编码为链上可识别的二进制数据(函数签名哈希前四字节加参数)。视频重点介绍了Solidity中的两种底层调用:call和delegatecall。call允许通过ABI编码灵活调用任意函数,且在转账时优于有gas限制的transfer方法。delegatecall则更为高级,它在执行目标合约代码时能保持调用者的上下文(msg.sender和msg.value不变),并在当前合约的存储中执行,是实现代理模式的关键。
关键信息:
- ABI (Application Binary Interface):用于描述合约接口,将函数调用(包括函数签名和参数)编码为链上可识别的二进制数据。函数签名通过哈希函数名和参数类型,取前四个字节得到。
- 交易类型:分为普通转账(无附加数据)、合约创建(传递字节码和参数)和合约调用(传递ABI编码数据)。
call底层调用:- 允许通过ABI编码灵活调用合约的任何函数,类似于编程语言中的反射机制。
- 在进行以太币转账时,
call方法没有transfer方法的2300 gas限制,因此是推荐的转账方式(transfer被视为技术债)。 - 调用失败时,
call会返回一个布尔值(success)和返回数据,而不会自动回滚交易,需要开发者手动检查返回值以确保安全性。 call会切换上下文,即被调用合约中的msg.sender会变为调用它的合约地址。
delegatecall委托调用:- 与
call最主要的区别在于它“保持上下文”,即被调用合约中的msg.sender和msg.value会保持为原始的外部调用者(EOA或最初的合约)。 delegatecall会借用目标合约的代码,但在当前合约的存储和上下文中执行,这意味着状态改变会发生在调用delegatecall的合约上。- 它是实现代理合约(Proxy Pattern)和可升级合约的关键机制。
- 与
address类型的方法:包括balance、code、call、delegatecall和staticcall。其中staticcall用于调用不修改状态的函数(类似view)。