Defender允许你轻松地跨链部署和升级智能合约,同时保持最佳的安全实践。本教程展示了如何使用一个Relayer来部署一个名为Box的合约,并通过一个Safewallet(多签钱包)使用UUPS代理模式进行升级。
SafeMath库是对solidity中uint256的加、减、乘、除和取模运算的一层封装。由于solidity 0.8之前的uint256运算是不做溢出检查,许多基于0.8版本之前的项目都会使用该库。0.8版本之后solidity编译器内置了整形数溢出检查,所以SafeMath库也不再被广泛使用。
本文介绍了Solidity中的继承概念,包括如何使用is关键字实现合约继承。文章详细讲解了virtual和override关键字在函数重写中的作用,以及internal关键字在控制函数可见性方面的应用。最后,通过OpenZeppelin的Ownable合约示例,展示了继承在实际开发中的应用,例如权限控制。
is
virtual
override
internal
本文介绍了OpenZeppelin,一个为以太坊和其他区块链平台提供安全、可重用智能合约库的公司和开源平台。文章概述了OpenZeppelin提供的关键产品和服务,并展示了如何通过npm安装OpenZeppelin,以及如何使用OpenZeppelin的ERC20代币合约。
SignedMath库提供了solidity中尚未内置的标准有符号数的数学运算方法。
SignedSafeMath库就是直接对solidity内置的int256类型的加减乘除运算的函数封装。
BitMaps库开发了一种存储更紧凑且高效的mapping(uint256=>bool)。传统的mapping(uint256=>bool)中一个slot只能存储一个键值对的bool值信息,而改用了BitMaps.BitMap数据结构后,一个slot理论上最多可以存256个键值对的bool值信息。
Openzeppelin中的ERC20库只提供了mint接口,而具体的发行逻辑需要开发者在其子合约中使用_mint()自行编写。该库同样遵循了OpenZeppelin的合约设计思路:当函数因产生错误返回false时,直接revert掉。这种设计思路与ERC20的期望标准并不冲突。
_mint()
EnumerableSet库提供了Bytes32Set、AddressSet和UintSet三种类型的set,分别适用于bytes32、address和uint256类型的元素。 每种set都提供了对应的增添元素、删除元素、查询当前set中元素个数等操作。几乎所有操作的时间复杂度均为O(1)。
本文介绍了如何使用 OpenZeppelin 框架创建 ERC-20 代币。首先,设置开发环境,包括安装 Hardhat 和 OpenZeppelin 依赖。然后,编写 ERC-20 代币合约,并使用 Hardhat 部署到以太坊测试网络。最后,配置并部署到以太坊主网络。使用 OpenZeppelin 可以安全高效地创建 ERC-20 代币。
EnumerableMap库提供了Bytes32ToBytes32Map、UintToUintMap、UintToAddressMap、AddressToUintMap和Bytes32ToUintMap五种可迭代的map。每种map都提供了增添/更新键值及查询等操作且所有操作的时间复杂度为O(1)。
本文主要分析了 ERC4626 标准下的 On-chain Vault 可能遭受的通胀攻击,攻击者通过操纵 Vault 中的资产总量来稀释其他用户的份额,并探讨了多种防御方法,包括初始化 Vault 资产、内部控制资产总量、使用 decimals offset 以及 OpenZeppelin 提出的虚拟份额和资产方案。
ERC165合约是IERC165的标准实现。ERC165提供了本合约是否实现了IERC165接口的查询。如果需要额外支持其他interface,可在目标合约内重写supportsInterface(bytes4)方法。
内联汇编中,Instruction "staticcall"的功能及使用方法与Instruction "call"类似。唯一不同的是在"staticcall"的过程中不允许发生storage的修改。
Ownable库提供了一种基本的访问控制机制——设置一个owner具有对某些函数特殊的访问权限。通常owner就是本合约的deployer。合约部署后可通过函数transferOwnership()进行owner的修改。本库还提供了modifier onlyOwner,用于为函数限定访问权限。