`
文章列表

multicall

multicall的solidity调用与ethers.js调用 // contracts/Box.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Multicall.sol"; import "hardhat/console.sol"; contract TestMulticall { function testMulticall(address addr) external ...

检查是否是721

// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; contract MyTokenCheck { using ERC165Checker for address; bytes4 private ...
2.栈和内存操作码 2.1 POP:取出栈顶元素 2.2 PUSH:向栈顶加入数据(可以直接在后边跟一个数字来指定要加入的字节数,取值范围为1到32,即最大为一个"字") 2.3 MLOAD:从内存中取出一个"字" 2.4 MSTORE:存储一个"字"到内存中 2.5 JUMP:修改程序计数器(PC)的位置 2.6 PC:程序计数器(program counter) 2.7 MSIZE:目前已激活(已使用)的内存大小(以"字"为单位) 2.8 GAS:可用的gas数量(当前交易内) 2.9 DUP:复制栈里的元素到栈 ...

计算合约地址

EVM会根据发送者地址和nonce经过RLP编码后再进行keccak256得到hash的低160位(即96到255)共计20字节作为生成合约的地址 const rlp = require("rlp"); const keccak = require("keccak"); function calculateContractAddr(sender,nonce){ // var nonce = 0x00; //The nonce must be a hex literal! // var sender = "0xf39F ...

标准修饰符

1.internal:类似c++中的protected,通过JUMP指令实现,参数以内存指针传递,消耗gas最少 2.external:函数参数直接从calldata读取,内存分配比较便宜 3.public:会自动创建getter,通过jump指令调用,会复制函数参数到memory(因为不知道调用者是external还是internal),也这是比external更消耗gas的一个原因 4.private:私有,仅当前合约能访问 5.constant:被修饰的函数没有能力改变区块链上的状态变量,它们可以读取状态变量返回给调用者 6.view:不能修改,类似constant 7.pure:不能读写 ...

ABI编码函数

1. abi.encode()returns(bytes):对给定参数进行编码 2. abi.encodePacked()returns(bytes):对给定参数进行紧打包编码 3. abi.encodeWithSelector(bytes4 selector,...) returns(bytes):对给定参数进行编码,并以给定的函数选择器作为起始的4字段数据一起返回 4. abi.encodeWithSignature(string signature,...) returns (bytes):等价于abi.encodeWithSelector(bytes4(keccak256(signatu ...

数据位置

1.函数参数包括返回的参数默认是memory 2.局部变量默认是storage,状态变量强制是storage 3.外部函数的参数强制是calldata与memory类似,是一块只读且不会永久存储的位置

随机数

https://www.paradigm.xyz/2023/01/eth-rng#introduction

extcodesize

extcodesize取出的byte code长度,若长度大于0就表示是合约发出的,等于0还不一定是EOA地址,因为在合约的构造函数发出,其byte code尚未初始化,仍为0 // SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; contract GatekeeperTwoAttack { constructor(address addr,address addr2){ //构造函数 at ...

Elevator

Elevator.sol // SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; interface Building { function isLastFloor(uint256) external returns (bool); } contract Elevator { bool public top; uint256 public floor; function test(uin ...

AccessControl

// SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "hardhat/console.sol&qu ...

revert

1.和require类似,在一些复杂代码时可以结合error使用 // SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; contract Revert { error TooEarly(uint time); error TooLate(uint time); function test(uint t)external{ if(t<100){ rever ...
// SPDX-License-Identifier: MIT pragma solidity >= 0.6.0; import "hardhat/console.sol"; contract Vault { bool public locked; bytes32 private password; uint256 private data; constructor(bytes32 _password) public { locked = true; password = _password; ...

Gas节省

1.storage比memory便宜,因为要memory要创建一个新的变量

使用其它合约

// SPDX-License-Identifier: MIT pragma solidity >= 0.6.0 < 0.9.0; import '@openzeppelin/contracts/utils/math/SafeMath.sol'; import "hardhat/console.sol"; interface ICoinFlip{ function flip(bool _guess) external returns (bool);//这里函数可见性要改成external } contract CoinFlip ...
Global site tag (gtag.js) - Google Analytics