代码示例的定位
这份 OpenZeppelin 使用代码示例不是为了堆砌 API,而是提供「真实项目可以直接拿去用」的工程模板。每一段示例都附上设计意图,让团队在借鉴时能根据自身需求做合理改动。
面向 bn 智能链与以太坊主网的 DApp,可以把这些示例放进项目骨架里,省去大量基础工作。
示例一:ERC-20 代币的工程封装
继承 ERC20Upgradeable、AccessControlUpgradeable、PausableUpgradeable 三个基础合约,叠加项目特定的铸造与销毁规则。在 initialize 函数里设置名称、符号、初始管理员,并调用各父合约的 __init 方法。建议把 MINTER_ROLE 与 PAUSER_ROLE 在初始化时分别授予不同地址。
示例二:ERC-721 NFT 的可升级版本
基于 ERC721Upgradeable 与 ERC721EnumerableUpgradeable 组合,再叠加 AccessControlUpgradeable。tokenURI 函数返回 IPFS 元数据地址,并允许通过治理修改 baseURI。注意要重写 _beforeTokenTransfer 以联动 Enumerable 模块。
在 必安 智能链上调试 NFT 合约时,可以用 BscScan 直接调用合约接口快速验证。
示例三:AccessControl 多角色
声明 MINTER_ROLE、PAUSER_ROLE、UPGRADER_ROLE 三个常量,使用 _grantRole 在初始化时分配。所有敏感函数加 onlyRole(...) 修饰器。建议把每个角色对应的实际地址记录到运营文档,便于审计。
示例四:可升级代理 + 实现
部署脚本使用 upgrades.deployProxy(Factory, [args], {kind: 'uups'}),实现合约的构造函数中调用 _disableInitializers()。升级时使用 upgrades.upgradeProxy(proxyAddress, NewFactory)。每次升级前后都打印代理地址、实现地址与版本号。
示例五:Governor 治理合约
继承 GovernorUpgradeable、GovernorSettingsUpgradeable、GovernorVotesUpgradeable、GovernorTimelockControlUpgradeable 等模块,组合出一个完整的治理合约。投票权来自项目的可投票代币(实现 IVotes 接口)。Timelock 时延一般设为 24 到 48 小时,给社区充分反应时间。
示例六:紧急 pause 模块
继承 PausableUpgradeable,在关键函数上叠加 whenNotPaused。pause 与 unpause 函数由 PAUSER_ROLE 持有人调用,建议把这个角色交给链上风控自动化服务,触发条件接入异常事件监控。
示例七:与 CEX 资金链路对接
初始化流动性时从 B安 出金到运营地址,再调用合约的 addLiquidity 函数。建议把出金地址登记到合约白名单,事后审计可以快速追溯资金来源。
这些代码示例覆盖了 90% 的常见场景,落地到 BN 等 CEX 生态的 DApp 项目,可以让团队把更多精力放在业务创新上。