Ethernaut 题库闯关 - Alien Codex 题解

Ethernaut 题库闯关追更, 挑战 AlienCodex 合约, 通过本挑战,我们将更深刻的理解 Solidity 的数据存储,以及如何通过写数组达到写插槽的效果。

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

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

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

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

Michael.W基于Foundry精读Openzeppelin第26期——ERC1820Implementer.sol

ERC1820Implementer合约是对IERC1820Implementer interface的实现。该合约往往与ERC1820Registry合约配合使用。如果想要合约成为ERC1820Registry记录在案的implementer,需要目标合约继承ERC1820Implementer。

Michael.W基于Foundry精读Openzeppelin第25期——IERC1820Registry.sol

IERC1820Registry.sol是global ERC1820 Registry的接口文件。ERC1820 Registry旨在创建一个全网唯一的interface与对应implementer的查询中心。所有地址都可以在其中注册interface与对应implementer的关联关系。

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
  • 阅读 ( 862 )
  • ( 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
  • 阅读 ( 1466 )

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
  • 阅读 ( 1697 )

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

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

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

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

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

  • Michael.W
  • 发布于 2023-08-02
  • 阅读 ( 1011 )
  • ( 4 )

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

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

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

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
  • 发布于 2023-07-30
  • 阅读 ( 1004 )
  • ( 3 )