本文详细介绍了通用可升级代理标准(UUPS)模式,该模式将升级逻辑置于实现合约中,以优化 Gas 消耗。文章对比了UUPS与透明代理的优缺点,并通过示例代码展示了UUPS的实现原理和升级流程。同时,强调了 UUPS 的风险,并介绍了如何使用 OpenZeppelin 的 UUPSUpgradeable 及 Foundry 插件进行安全部署和升级。
本文深入探讨了EVM存储机制,对比了storage、memory、calldata和transient storage等不同存储位置的Gas成本,并提供了变量打包、利用immutable和constant、删除存储变量退Gas、缓存存储变量到内存等实用优化技巧。同时讨论了mapping与array、bytes与string的选择,以及memory和calldata的优化策略,最后强调了优化的...
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标准存储槽避免存储冲突,实现了对用户透明的合约升级。