Michael.W基于Foundry精读Openzeppelin第24期——ERC165Storage.sol

ERC165Storage合约是ERC165的一种拓展。IERC165的supportsInterface(bytes4)函数的标准实现方式是静态地将已实现接口的interface id硬编码到bytecode中,而ERC165Storage则可在合约部署后动态地添加支持的interface id。

Michael.W基于Foundry精读Openzeppelin第23期——ERC165Checker.sol

ERC165Checker库是用来查询已实现IERC165的目标合约自身实现了哪些interface的工具库。在使用时需要注意:利用ERC165Checker提供的查询方法进行查询的过程不会因为目标合约没有实现待查询interface而发生revert。

(番外篇)Michael.W基于Foundry精读Openzeppelin第22期——内联汇编staticcall

内联汇编中,Instruction "staticcall"的功能及使用方法与Instruction "call"类似。唯一不同的是在"staticcall"的过程中不允许发生storage的修改。

Solidity 开发教程 - Solidity 开发基础系列

Solidity 开发基础: 使用Remix、数据类型(整型、地址、合约、数组、结构体、映射)介绍;函数修改器、事件、错误处理、库的使用。

  • DeCert.me
  • 发布于 2023-08-08
  • 阅读 ( 861 )
  • ( 20 )

Michael.W基于Foundry精读Openzeppelin第21期——ERC165.sol

ERC165合约是IERC165的标准实现。ERC165提供了本合约是否实现了IERC165接口的查询。如果需要额外支持其他interface,可在目标合约内重写supportsInterface(bytes4)方法。

Michael.W基于Foundry精读Openzeppelin第20期——EnumerableMap.sol

EnumerableMap库提供了Bytes32ToBytes32Map、UintToUintMap、UintToAddressMap、AddressToUintMap和Bytes32ToUintMap五种可迭代的map。每种map都提供了增添/更新键值及查询等操作且所有操作的时间复杂度为O(1)。

深入理解 Solidity 错误 #4 - try/catch

Solidity 的try/catch 语法和常见的语言中的表现不一样,try { } 块中的代码错误是无法被catch 的,这一点要小心要非常小心。

  • Tiny熊
  • 发布于 2023-08-04
  • 阅读 ( 1377 )

Michael.W基于Foundry精读Openzeppelin第19期——EnumerableSet.sol

EnumerableSet库提供了Bytes32Set、AddressSet和UintSet三种类型的set,分别适用于bytes32、address和uint256类型的元素。 每种set都提供了对应的增添元素、删除元素、查询当前set中元素个数等操作。几乎所有操作的时间复杂度均为O(1)。

深入理解 Solidity 错误 #3 - 错误处理

在深入理解 Solidity 错误"的第三篇, 探索处理错误,本文将揭晓这问问题的答案:asset 错误会消耗所有 gas 吗? require 提不提供错误字符有什么样的不同?外部调用的错误如何影响当前上下文?如何处理底层调用调用产生的错误?

  • Tiny熊
  • 发布于 2023-08-03
  • 阅读 ( 1595 )

深入理解 Solidity 错误 #2 - 运行时错误

在运行时错误是最常遇到的情况,你知道 ErrorPanic 的细微差别吗? 发生 Panic 错误真的会消耗所有的 gas 么,本文揭晓答案。

  • Tiny熊
  • 发布于 2023-08-02
  • 阅读 ( 1328 )

Michael.W基于Foundry精读Openzeppelin第18期——DoubleEndedQueue.sol

DoubleEndedQueue库提供了双向队列的数据结构及对应操作库函数,提供了队头或队尾插入及弹出元素值等逻辑功能。本库采用优化过的storage存储且所有操作的时间复杂度都是O(1)。特别要注意的是库中的clear操作仅仅将队头和队尾指针清零,而之前队列中的元素值依然留存在storage中

深入了解 Solidity 错误 #1 - 编译器错误

深入了解 Solidity 错误第二篇, 了解编译器错误。

  • Tiny熊
  • 发布于 2023-08-01
  • 阅读 ( 1650 )

Michael.W基于Foundry精读Openzeppelin第17期——BitMaps.sol

BitMaps库开发了一种存储更紧凑且高效的mapping(uint256=>bool)。传统的mapping(uint256=>bool)中一个slot只能存储一个键值对的bool值信息,而改用了BitMaps.BitMap数据结构后,一个slot理论上最多可以存256个键值对的bool值信息。

Michael.W基于Foundry精读Openzeppelin第16期——SignedSafeMath.sol

SignedSafeMath库就是直接对solidity内置的int256类型的加减乘除运算的函数封装。

Michael.W基于Foundry精读Openzeppelin第15期——SignedMath.sol

SignedMath库提供了solidity中尚未内置的标准有符号数的数学运算方法。

Michael.W基于Foundry精读Openzeppelin第14期——SafeMath.sol

SafeMath库是对solidity中uint256的加、减、乘、除和取模运算的一层封装。由于solidity 0.8之前的uint256运算是不做溢出检查,许多基于0.8版本之前的项目都会使用该库。0.8版本之后solidity编译器内置了整形数溢出检查,所以SafeMath库也不再被广泛使用。

Michael.W基于Foundry精读Openzeppelin第13期——Checkpoints.sol

Checkpoints库定义了History、Trace224和Trace160结构体。这些结构体中包含了在各个不同的区块高度或自定义key上记录的数值并可以查询出对应区块高度或key上的记录值。Checkpoints库提供了标准的添加记录、查询记录的库方法。

Michael.W基于Foundry精读Openzeppelin第12期——SafeCast.sol

SafeCast库提供了solidity的基础整数类型uintX和intX之间的类型安全转换的库方法。在不同的类型转换之间都加入溢出检查,如果一旦在转换过程中出现类型的溢出会立刻revert。

Michael.W基于Foundry精读Openzeppelin第11期——Math.sol

Math库为合约开发提供了solidity内置的uint256运算以外的其他整形运算方法。solidity内置的整形运算,每一步都会做overflow revert(除非unchecked{}),而Math库会在不影响结果准确性的前提下利用位溢出进行更加tricky的操作。

Michael.W基于Foundry精读Openzeppelin第10期——Create2.sol

Create2库本质就是对EVM opcode CREATE2进行的一个封装,可以让开发者在非内联汇编环境下直接使用该opcode。 CREATE2是一种可提前计算合约部署地址的合约部署opcode。而传统的合约部署是通过opcode CREATE完成的。

  • Michael.W
  • 发布于 2023-07-17
  • 阅读 ( 1027 )
  • ( 9 )