本文介绍了Hardhat以太坊开发框架,包括创建和配置项目、编写智能合约、使用Solidity编写/typescript测试、使用console.log调试Solidity代码,以及部署合约和代码开源验证等步骤。Hardhat提供了更快的编译和测试,支持Solidity测试,内置调试器,并提供Hardhat Network用于本地开发,方便开发者进行以太坊智能合约的开发。
Foundry是一个以Solidity为中心的以太坊开发框架,用于构建、测试、调试和部署智能合约。它提供了一整套工具链,包括forge、cast、anvil和chisel,支持快速构建和测试,并拥有强大的测试功能,如作弊码、模糊测试和主网Fork。Foundry是目前Solidity开发中使用广泛的框架。
本文详细介绍了通用可升级代理标准(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 数据项访问。事件日志由主题和数据组成,主题用于索引事件,数据存储额外信息。文章还介绍了事件签名、主题值的计算以及匿名事件。