该软件包为您的Hardhat脚本添加了功能,以便您可以为您的合同部署和升级代理。取决于ethers.js。
OpenZeppelin 5.x 发布仅三周,目前网上除了官方之后没有详细的介绍,这篇文章是OpenZeppelin5.x概览,可以帮助读者迅速的了解5.x和4.x的主要区别~
使用 React和 Network.js 构建可通过 Infura 和 Metamask 接入以太坊主网并请求数据的去中心化应用前端
许多在线ECDSA教程涉及到数学的使用,关于s, r, v的一些东西,我们所有的开发人员都同意,其是无聊的,并且很难在没有bug的情况下实现。因此,在本文中,我们将使用OpenZeppelin和Ethers.js编写的合约中的内置函数来构建这个功能。
使用UUPS升级智能合约
ERC20VotesComp库是专门适配Compound投票和委托的ERC20拓展库。本库可对接Compound的接口,同时也存在缺点(总发行量上限为2^96 - 1)。如果业务上确定需要兼容Compound,那必须弄清楚总发行量上限是否符合业务需求。否则可使用ERC20Votes库。
ERC20Votes
AccessControlEnumerable库用于管理函数的调用权限,是AccessControl库的拓展版。与AccessControl库相比,AccessControlEnumerable支持在编成员的迭代导出,这大大方便了各个角色权限的统计查询。
Proxy库对外只暴露了fallback和receive函数,是代理合约的基础实现。所有对Proxy合约的call都将被delegatecall到implement合约且delegatecall的执行结果会原封不动地返还给Proxy合约的调用方。通常称implement合约为代理合约背后的逻辑合约。
ERC20Snapshot库是ERC20的拓展,增加了各账户余额及总流通量的快照机制。如果涉及到根据账户ERC20余额进行分红、投票等业务可以使用该库,其可有效防御在不同地址间转账进行“一币多用”的攻击。在一个快照横截面数据上进行分红、投票甚至是ERC20分叉都是最有效的解决方案。
ERC4626库本身是一种有底层ERC20资产质押的shares且本身同样满足ERC20标准。用户可以通过deposit或mint方法来质押底层资产并增发shares,也可使用burn或redeem方法来销毁shares并赎回底层资产。
ERC20PresetFixedSupply库是一种带预铸造功能的ERC20实现,即在合约部署时直接将全部流通量都铸造给某一地址且部署后无法增发。该库同时继承了ERC20Burnable库,支持销毁和委托销毁功能。
UUPSUpgradeable库是专为UUPS代理设计的一种合约升级机制的实现。当本合约被设置为ERC1967Proxy代理合约背后的逻辑合约后,可以对其进行合约升级操作。作为逻辑合约的父合约,本库的安全机制可保证不会因某次错误的升级而打破合约的可升级性。
Clones库是最小代理合约的工厂合约实现,也称之为克隆工厂。ERC1167指定了一种将全部调用都delegatecall到一个已知固定地址的最小字节码实现,它可以以一种不可变且成本极低的方式克隆目标合约。
UpgradeableBeacon库是信标代理模式中的信标合约的实现,与一个或多个BeaconProxy库实例配合使用。所有到BeaconProxy的调用都会被委托到本库指向的逻辑合约上。本库的owner具有更换逻辑合约地址的权限,从而实现信标代理合约的升级功能。
BeaconProxy
TransparentUpgradeableProxy库是一个透明代理合约的实现,其背后的逻辑合约可由admin来升级。一般的代理合约本身需要管理函数,当这些函数同其背后的逻辑合约的函数产生selector冲突时可能会暴露潜在的漏洞。透明代理模式解决了以上问题。