自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Revelation_of_Turing

Blockchain,因为专注,所以专业。

  • 博客(123)
  • 收藏
  • 关注

原创 Michael.W基于Foundry精读Openzeppelin第66期——ProxyAdmin.sol

ProxyAdmin库是指定用于做透明代理TransparentUpgradeableProxy库admin的管理员合约。

2024-07-21 15:08:47 700

原创 Michael.W基于Foundry精读Openzeppelin第65期——TransparentUpgradeableProxy.sol

TransparentUpgradeableProxy库是一个透明代理合约的实现,其背后的逻辑合约可由admin来升级。一般的代理合约本身需要管理函数,当这些函数同其背后的逻辑合约的函数产生selector冲突时可能会暴露潜在的漏洞。透明代理模式解决了以上问题,对代理合约的调用遵从:1.非admin的全部调用都会delegatecall到逻辑合约;2.admin只能调用代理合约的管理函数。这意味着admin只能用于触发像升级逻辑合约或改变admin这样的操作(admin无法参与任何逻辑合约的业务)。

2024-07-19 14:11:58 813

原创 Michael.W基于Foundry精读Openzeppelin第64期——UUPSUpgradeable.sol

UUPSUpgradeable库是专为UUPS代理设计的一种合约升级机制的实现。当本合约被设置为ERC1967Proxy代理合约背后的逻辑合约后,可以对其进行合约升级操作。作为逻辑合约的父合约,本库的安全机制可保证不会因一次错误的升级而打破合约的可升级性。

2024-07-16 22:38:15 862

原创 Michael.W基于Foundry精读Openzeppelin第63期——Initializable.sol

Initializable库用于开发可升级合约或代理合约背后的逻辑合约。由于代理合约无法执行`constructor`函数,通常是将该函数逻辑放到一个external函数中(称为initialize函数)。本库可确保initializer函数全局只能被调用一次。initializer函数具有version且每个version只能使用一次。该机制可防止重新执行原初始化步骤但又允许在合约升级时添加新的初始化步骤。

2024-07-09 18:10:29 878

原创 Michael.W基于Foundry精读Openzeppelin第62期——ERC1967Proxy.sol

ERC1967Proxy库实现了一个基于ERC1967标准的代理合约。通过改变存储于ERC1967标准规定的_IMPLEMENTATION_SLOT号slot中的代理合约地址,代理合约便实现了合约逻辑可升级的功能。

2024-07-04 09:45:46 1067

原创 Michael.W基于Foundry精读Openzeppelin第61期——ERC1967Upgrade.sol

ERC1967Upgrade库实现了基于ERC1967标准(代理合约的slot分布)的slots读写函数,并在对应slot更新时emit出标准中相应的event。对于各种可升级合约和代理合约的实现而言,本库的作用举足轻重。

2024-07-02 20:30:26 712

原创 Michael.W基于Foundry精读Openzeppelin第60期——Clones.sol

Clones库是最小代理合约的工厂合约实现,也称之为克隆工厂。ERC1167指定了一种将全部调用都delegatecall到一个已知固定地址的最小字节码实现,它可以以一种不可变且成本极低的方式克隆目标合约。本库分别提供了使用opcode CREATE和CREATE2部署最小代理合约的方法以及CREATE2部署合约的地址预计算工具。

2024-06-26 20:57:47 1152

原创 Michael.W基于Foundry精读Openzeppelin第59期——Proxy.sol

Proxy库对外只暴露了fallback和receive函数,是代理合约的基础实现。所有对Proxy合约的call都将被delegatecall到implement合约并且delegatecall的执行结果会原封不动地返还给Proxy合约的调用方。我们通常称implement合约为代理合约背后的逻辑合约。

2024-06-23 20:35:41 1003

原创 Michael.W基于Foundry精读Openzeppelin第58期——PullPayment.sol

PullPayment库是对Openzeppelin中Escrow库的一种封装。从安全角度看,PullPayment是一对多发送eth的最佳解决方案。它可以防止收款人阻塞发送eth的行为并消除重入问题。

2024-06-18 10:17:31 771

原创 Michael.W基于Foundry精读Openzeppelin第57期——ReentrancyGuard.sol

ReentrancyGuard库是一个用来防御函数重入的工具库。函数被修饰器`nonReentrant`修饰可确保其无法被嵌套(重入)调用。本库的代码逻辑上只实现了一个重入锁,所以被`nonReentrant`修饰的函数之间也是无法相互调用的。

2024-06-12 09:46:11 834

原创 Michael.W基于Foundry精读Openzeppelin第56期——VestingWallet.sol

VestingWallet库可以给指定的受益人地址按照时间线性释放锁在合约内的Eth和Erc20 token。任何转移至本合约的token都必须遵循释放模型。开发者可通过重写函数`vestedAmount(uint64 timestamp)`或`vestedAmount(address token, uint64 timestamp)`来自定义token释放模型。

2024-06-04 18:10:59 1147

原创 Michael.W基于Foundry精读Openzeppelin第55期——PaymentSplitter.sol

PaymentSplitter库可以在一组领取地址无感知的情况下,将定量eth或某ERC20 token按照shares占比释放给该组中的某地址。当eth或ERC20 token被转入该合约后,在册的领取地址就可以来领取属于自己占比的那部分。各领取人的shares数量只能在该合约部署时被设置。领取eth和ERC20 token需要通过触发release函数完成。

2024-05-31 09:59:40 942

原创 Michael.W基于Foundry精读Openzeppelin第54期——ERC20PresetMinterPauser.sol

ERC20PresetMinterPauser库是一种带mint和pause权限管理的ERC20实现,同时支持销毁和委托销毁的功能。当合约进入paused状态后,全部token的转移功能都将被停止。权限管理功能是直接继承AccessControlEnumerable库。

2024-04-01 17:28:01 747

原创 Michael.W基于Foundry精读Openzeppelin第53期——ERC20PresetFixedSupply.sol

ERC20PresetFixedSupply库是一种带预铸造功能的ERC20实现,即在合约部署时直接将全部流通量都铸造给某一地址且部署后无法增发。该库同时继承了ERC20Burnable库,支持销毁和委托销毁功能。ERC20Burnable库详解参见:https://learnblockchain.cn/article/7038

2024-03-27 10:57:29 477

原创 Michael.W基于Foundry精读Openzeppelin第52期——ERC4626.sol

ERC4626库本身是一种有底层ERC20资产质押的shares且本身同样满足ERC20标准。用户可以通过deposit或mint方法来质押底层资产并增发shares,也可使用burn或redeem方法来销毁shares并赎回底层资产。需要注意的是:当底层资产接近或等于0时,可以通过事先向本合约转入少许底层资产来急速拉升shares的价格。这本质上是一种基于滑点问题的攻击手段,合约部署者可以向合约内提供一笔初始底层资产来抵御以上攻击。在赎回底层资产的过程中同样也会面临滑点问题。

2024-03-26 18:38:45 1142

原创 Michael.W基于Foundry精读Openzeppelin第51期——ERC20VotesComp.sol

ERC20VotesComp库是专门适配Compound投票和委托的ERC20拓展库。本库可对接Compound的接口,同时也存在缺点(总发行量上限为2^96^ - 1)。如果业务上确定需要兼容Compound(如:要在Compound Governor Alpha或Bravo中使用该ERC20),那必须弄清楚总发行量上限是否符合业务需求。否则可使用`ERC20Votes`库。

2024-03-19 15:52:49 820

原创 Michael.W基于Foundry精读Openzeppelin第50期——ERC20Votes.sol

ERC20Votes库是一个具备类Compound委托投票功能的ERC20拓展库。本库的发行量上限是2^224^-1,比Compound更通用(COMP是2^96^-1)。合约内部使用快照结构Checkpoint来记录每个投票目标地址的总票数,每个token持有者可以采用直接或者离线签名两种方式委托投票给任何地址。每个目标地址得到的总票数和总发行量支持指定区块高度的快照查询。为了节约转账gas,余额计算并不包含本身被委托的票数,但是委托票数会随着用户的转账发生对应目标的转移。

2024-03-14 17:22:16 949

原创 Michael.W基于Foundry精读Openzeppelin第49期——ERC20Wrapper.sol

ERC20Wrapper库是一种对某ERC20 token作为标的资产进行包装的wrapped ERC20 token。用户可以质押或赎回标的token,同时获得或销毁相同数量的wrapped token。该库可与其他ERC20拓展库结合使用,如:与ERC20Votes库结合,可将已有的ERC20 token包装成治理token。

2024-03-06 16:37:42 947

原创 Michael.W基于Foundry精读Openzeppelin第48期——TokenTimelock.sol

TokenTimelock库是是一个锁币合约。它允许指定地址在某一时间点及之后取出全部锁存的代币,实现了一个代币时间锁的功能。

2024-01-19 10:49:05 960

原创 Michael.W基于Foundry精读Openzeppelin第47期——SafeERC20.sol

SafeERC20库封装了ERC20的操作,使各操作执行失败时触发revert。因为标准IERC20的转账和授权等需通过一个bool返回值来表示操作是否成功,可能实现合约内部没有设置revert机制。有的ERC20合约的授权或转账的实现并无返回值(以太坊上的USDT合约),此时可通过本库与其交互。

2024-01-17 21:01:42 1259

原创 Michael.W基于Foundry精读Openzeppelin第46期——ERC20Snapshot.sol

ERC20Snapshot库是ERC20的拓展,增加了各账户余额及总流通量的快照机制。如果涉及到根据账户ERC20余额进行分红、投票等业务可以使用该库,其可有效防御在不同地址间转账进行“一币多用”的攻击。在一个快照横截面数据上进行分红、投票甚至是ERC20分叉都是最有效的解决方案。本库具有高效性,创建快照、快照上查询地址余额及总流通量的时间复杂度分别是`O(1)`和`O(log n)`。但快照功能的存在会增加ERC20发生转移时的gas成本。

2024-01-02 21:08:57 932

原创 Michael.W基于Foundry精读Openzeppelin第45期——ERC20FlashMint.sol

ERC20FlashMint库是ERC20的拓展,也是关于闪电贷ERC3156的实现。ERC20FlashMint库在ERC20的基础上实现了IERC3156FlashLender接口,在token层面上支持了闪电贷功能。但是该库默认没有闪电贷手续费,开发者可以通过重写`flashFee()`方法来自定义手续费计算逻辑。

2023-12-26 22:22:05 139

原创 Michael.W基于Foundry精读Openzeppelin第44期——ERC20Pausable.sol

ERC20Pausable库是ERC20的拓展。考虑到如下业务需求:1. 在一定时间段内禁止该token的交易;2. 当合约出现重大bug时,紧急停止一切该token的转移,该库提供了可暂停的transfer、mint及burn功能。需要注意的是:ERC20Pausable库并没有提供切换暂停状态的函数,需要开发人员自行开发——同时需要注意切换暂停状态的权限问题。

2023-12-22 16:29:02 151

原创 Michael.W基于Foundry精读Openzeppelin第43期——Pausable.sol

Pausable库实现了功能函数紧急关停机制,可以继承该合约并使管理员账户来调控合约的开关。合约内有两个修饰器`whenNotPaused`和`whenPaused`,可以根据业务需求将其修饰在对应的函数上来进行开放或关停状态下的访问限制。

2023-12-19 15:21:04 151

原创 Michael.W基于Foundry精读Openzeppelin第42期——draft-ERC20Permit.sol

ERC20Permit库是ERC20的拓展。本库通过permit方法允许调用者携带owner的链下签名来进行token的授权。这样,ERC20 token的owner不再需要自己调用approve方法进行授权,进而实现了owner的EOA账户无eth也可完成授权操作。

2023-12-15 17:34:56 190

原创 Michael.W基于Foundry精读Openzeppelin第41期——ERC20Capped.sol

ERC20Capped库是ERC20的拓展。该库设置了ERC20发行量的上限。

2023-12-08 17:56:11 172

原创 Michael.W基于Foundry精读Openzeppelin第40期——ERC20Burnable.sol

ERC20Burnable库是ERC20的拓展。该库允许用户销毁自己和给自己授权的人名下的token。

2023-12-07 16:13:42 145

原创 Michael.W基于Foundry精读Openzeppelin第39期——ERC20.sol

Openzeppelin中的ERC20库只提供了mint接口,而具体的发行逻辑需要开发者在其子合约中使用`_mint()`自行编写。该库同样遵循了OpenZeppelin的合约设计思路:当函数因产生错误返回false时,直接revert掉。这种设计思路与ERC20的期望标准并不冲突。

2023-12-04 17:49:22 259

原创 Michael.W基于Foundry精读Openzeppelin第38期——AccessControlEnumerable.sol

AccessControlEnumerable库用于管理函数的调用权限,是AccessControl库的拓展版。与AccessControl库相比,AccessControlEnumerable支持在编成员的迭代导出,这大大方便了各个角色权限的统计查询(不用通过扫块追溯events来统计目前各角色的在编权限人员的地址)。

2023-11-17 18:08:43 268

原创 Michael.W基于Foundry精读Openzeppelin第37期——AccessControl.sol

AccessControl库用于管理函数的调用权限,所有继承了AccessControl的子合约均可为自己的业务函数设置调用权限。AccessControl是一个轻量级的基础库且各个role不支持在编成员的迭代导出,所以授权和撤销role成员的操作会抛出event。role表示角色权限的种类,不同的bytes32表示不同的角色权限。各个role可以由自己的admin role在编地址管理本role的在编人员名单,并且合约内涉及的role应该由bytes32 public constant暴露给外部。

2023-09-28 16:59:28 151

原创 Michael.W基于Foundry精读Openzeppelin第36期——Ownable2Step.sol

Ownable2Step库是Ownable库的拓展版本。其提供的访问权限机制同Ownable完全一致,只是owner的更换机制从由原owner直接指定(一次交互)变成原owner指定 + 新owner确认(两次交互)。Ownable2Step库具有Ownable库所有的功能函数。

2023-09-21 20:21:11 149

原创 Michael.W基于Foundry精读Openzeppelin第35期——Ownable.sol

Ownable库提供了一种基本的访问控制机制——设置一个owner具有对某些函数特殊的访问权限。通常owner就是本合约的deployer。合约部署后可通过函数transferOwnership()进行owner的修改。本库还提供了modifier onlyOwner,用于为函数限定访问权限。

2023-09-18 20:50:55 183

原创 Michael.W基于Foundry精读Openzeppelin第34期——MerkleProof.sol

MerkleProof库提供了用于验证merkle树proof的工具函数。在生成merkle树和对应proof时,应当避免使用64字节长度的leaf(进行hash之前)或避免使用非keccak256的哈希函数(进行leaf的hash计算)。这是因为merkle树中经过排序的内部节点的拼接可以被重新解释为leaf值。

2023-09-16 18:50:57 182

原创 Michael.W基于Foundry精读Openzeppelin第33期——EIP712.sol

EIP-712是一个专门用于对结构化数据求hash值以及签名的标准,主要解决了数据“链下签名+链上验证”并提高了链上消息签名的可用性。EIP712合约提供了EIP 712 domain separator的定义与获取——是结构化数据完整编码的一部分。

2023-08-29 22:45:17 355

原创 Michael.W基于Foundry精读Openzeppelin第32期——SignatureChecker.sol

SignatureChecker库是一个用于链上签名验证的helper库。该库提供的验签函数既支持EOA账户地址的签名验证也支持IERC1271标准合约地址的签名验证。

2023-08-28 16:06:49 173

原创 Michael.W基于Foundry精读Openzeppelin第31期——IERC1271.sol

IERC1271是合约地址作为signer的签名验证标准。EOA地址可以通过其私钥对msg进行签名,而合约地址理论上是没有私钥的。当合约地址作为msg.sender时,可以通过IERC1271标准进行相关的签名验证工作。

2023-08-23 22:52:05 101

原创 Michael.W基于Foundry精读Openzeppelin第30期——ECDSA.sol

ECDSA(Elliptic Curve Digital Signature Algorithm)是椭圆曲线数字签名算法的简称。ECDSA库十分重要且使用广泛,其作用是在链上验证某message是否由给定的地址的私钥持有者进行签名的。简而言之,ECDSA库是一个验证地址真实身份的工具库。

2023-08-23 01:17:53 305

原创 Michael.W基于Foundry精读Openzeppelin第29期——RefundEscrow.sol

RefundEscrow合约继承了ConditionalEscrow合约,是ConditionalEscrow合约的一种功能拓展。RefundEscrow合约提供了基础的存取eth功能,同时合约owner可以将合约切换到Refunding或Closed状态。Refunding状态下,owner可以将锁存的eth分发给对应refundee;Closed状态下,beneficiary可以提走合约内全部eth。

2023-08-17 23:17:39 108

原创 Michael.W基于Foundry精读Openzeppelin第28期——ConditionalEscrow.sol

ConditionalEscrow合约继承了Escrow合约,是其的一种功能拓展。ConditionalEscrow的框架中提供设置可withdraw条件,并且只有在满足该条件时才允许owner为对应payee提取eth。

2023-08-16 20:42:58 101

原创 Michael.W基于Foundry精读Openzeppelin第27期——Escrow.sol

Escrow合约是Openzeppelin中所有escrow拓展库的基础合约,用于为指定地址锁存eth和提取eth的托管场景。该合约中存入和取出eth的方法都被virtual修饰,开发者可以通过继承重写的方式来做相关修改。

2023-08-15 21:32:02 79

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除