Adam Back是密码朋克和Hashcash的发明者,Hashcash是比特币工作量证明机制的直接前身。他是密码学专家,也是Blockstream公司的CEO,持续推动比特币和区块链技术的发展。他在比特币早期与中本聪有邮件往来,对密码学和去中心化领域有深远影响。
delegatecall 是一种特殊的底层调用函数,它与 call 的核心区别在于不切换执行上下文,msg.sender 保持为原始调用者,修改的是调用者合约的状态(使用被调用合约的代码)。delegatecall 最典型的应用场景是代理合约,通过代理模式,可以实现合约的升级而不改变合约地址。使用 delegatecall 时,调用者和被调用合约必须有相同的存储布局,否则会导致数据混乱。
msg.sender
本文深入介绍了Solidity 0.8.24版本引入的瞬时存储(transient)特性,这是一种新的数据存储位置,数据仅在单个交易执行期间存在,并可在同一交易的多个合约调用之间共享。瞬时存储相较于storage更节省Gas,且具有自动清理的特性,非常适合用于防重入锁等场景。文章还对比了瞬时存储与其他存储位置的差异,并提供了使用注意事项和实战示例。
代理合约作为用户与实际业务逻辑之间的中介,用于解决智能合约部署后无法更改的问题。代理合约存储数据,实现合约包含逻辑,通过delegatecall在代理上下文中执行实现合约的代码,升级时替换实现合约。为避免存储冲突,可使用EIP-1967标准,为避免函数选择器冲突,可使用透明代理或UUPS模式。
delegatecall
本文深入讲解了Solidity中call底层调用函数。call 主要用于调用合约函数和转移以太币,允许在运行时动态决定调用目标合约和函数,无需预先知道合约接口。文章还介绍了如何使用 call 进行 ETH 转账,控制 Gas 数量,以及防范重入攻击的安全模式,并对比了 call,delegatecall,staticcall 三种调用方式。
call
staticcall
本文介绍了以太坊中事件日志的概念、作用和访问方法。事件日志用于记录智能合约中发生的事件,通过交易回执中的 logs 数据项访问。事件日志由主题和数据组成,主题用于索引事件,数据存储额外信息。文章还介绍了事件签名、主题值的计算以及匿名事件。
本文深入探讨了以太坊智能合约中数字签名的概念、原理和应用。数字签名用于验证消息的真实性和完整性,通过私钥签名消息,并使用签名恢复地址进行验证。文章介绍了如何在Solidity中使用ecrecover函数以及OpenZeppelin库进行签名验证,并探讨了例如白名单铸造等实际应用场景,以及签名重放攻击等安全注意事项和调试方法。
ecrecover
本文深入解析了以太坊透明代理模式,该模式通过调用者身份来区分调用目标,解决了代理合约与实现合约函数选择器冲突的问题。透明代理合约本身不定义任何显式函数,所有操作均在fallback 函数中处理,根据调用者是管理员还是普通用户,分别进行升级管理或转发到实现合约执行业务逻辑。同时,利用EIP-1967标准存储槽避免存储冲突,实现了对用户透明的合约升级。
本文深入探讨了Solidity中合约内部创建合约的两种主要方法:create和create2。create通过new关键字快速部署新合约,合约地址由创建者地址和nonce决定。create2则允许开发者通过salt值预先确定合约地址,适用于可升级智能合约和确定性部署等高级场景,提供了更灵活的控制。
create
create2
new
staticcall是地址类型提供的只读底层调用函数,用于安全地读取其他合约的数据,验证合约接口,估算Gas消耗以及进行安全检查。它保证不会修改状态,适合用于查询操作,但需要注意返回值检查,不支持发送ETH,且需手动解码返回数据。