`
文章列表

MPT树

每一个以太坊的区块头包含三颗MPT树,分别是 交易树 收据树(交易执行过程中的一些数据) 状态树(账号信息, 合约账户和用户账户) 从编码来说,有三种编码: Raw编码:原生的key编码,是MPT对外提供接口中使用的编码方式,当数据项被插入到树中时,Raw编码被转换成Hex编码; Hex编码:16进制扩展编码,用于对内存中树节点key进行编码,当树节点被持久化到数据库时,Hex编码被转换成HP编码; HP编码:16进制前缀编码,用于对数据库中树节点key进行编码,当树节点被加载到内存时,HP编码被转换成Hex编码; Trie树的插入,这是一个递归调用的方法,从根节点开始,一直往下找,直到 ...

library

库和合约的区别在于库不能有Fallback函数以及paynable关键字,也不能定义storage变量.但是库可以修改和它们相链接的合约的storage变量,类似为一个函数传入一个C的指针 库不能有日志(Event),但可以分发事件,通过using xxx for xxx,作用于其它合约变量,当触发库event时需要监控其它合约才行 用于扩展 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; import "hardhat/console.sol"; stru ...

interface

接口类似于抽象合约,但是它们不能实现任何函数。还有进一步的限制: 1.无法继承其他合约,不过可以继承其他接口。 2.所有的函数都需要是 external 3.无法定义构造函数。 4.无法定义状态变量。 将来可能会解除这里的某些限制 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; import "hardhat/console.sol"; interface Interface { enum TokenType { Fungible, NonFungi ...

abstract

// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; import "hardhat/console.sol"; //如果未实现合约中的至少一个函数,则需要将合约标记为 abstract。 即使实现了所有功能,合同也可能被标记为abstract。 abstract contract BaseAbstract { function fun() public virtual; function fun2() public virtual; } ...

constructor

// SPDX-License-Identifier: GPL-3.0 pragma solidity >0.6.99 <0.9.0; contract Base { uint public x; constructor(uint _x) { x = _x; } } //直接在继承列表中指定参数 contract Derived1 is Base(7) { constructor() {} } //或通过派生的构造函数中用 修饰符 "modifier" contract Derived2 is Base ...

virtual

标记此函数可以被重写。只有标记为virtual的函数才可以重写(override) pragma solidity >= 0.4.0 <0.9; import "hardhat/console.sol"; contract IVirtual { function fun() public virtual m{ console.log("virtual fun"); } modifier m() virtual{ console.log("virtual ...

public

public变量会自动生成getter pragma solidity >= 0.4.0 <0.9.0; contract Get{ int internal iData; int public pData; //会自动生成getter() constructor(){ iData = 100; int d = this.pData(); //自动生成的getter()需要加this.调用 } }

可见性

用于函数对外调用,相比于public,可以省gas,不可以直接内部调用,但可以this.f 但不能修饰状态变量 pragma solidity >= 0.4.0 <0.9.0; contract States{ int private privateData; int public publicData;//自动增加view的getter() int internal internalData; //int external externalData; //状态变量不能定义为external } contract State ...

panic编号

0x01: 如果你调用 assert 的参数(表达式)结果为 false 。 0x11: 在``unchecked { … }``外,如果算术运算结果向上或向下溢出。 0x12; 如果你用零当除数做除法或模运算(例如 5 / 0 或 23 % 0 )。 0x21: 如果你将一个太大的数或负数值转换为一个枚举类型。 0x22: 如果你访问一个没有正确编码的存储byte数组. 0x31: 如果在空数组上 .pop() 。 0x32: 如果你访问 bytesN 数组(或切片)的索引太大或为负数。(例如: x[i] 而 i >= x.length 或 i < 0). 0x41: 如果你分配了 ...
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; import "hardhat/console.sol"; interface IType { function it()external view; } contract Type { constructor(){ console.log("name:",type(Type).name); console.log("c ...

内置属性

blockhash(uint blockNumber) returns (bytes32):指定区块的区块哈希——仅可用于最新的 256 个区块且不包括当前区块 block.chainid (uint): 当前链 id block.coinbase ( address ): 挖出当前区块的矿工地址 block.difficulty ( uint ): 当前区块难度 block.gaslimit ( uint ): 当前区块 gas 限额 block.number ( uint ): 当前区块号 block.timestamp ( uint): 自 unix epoch 起始当前区块以秒计的时间戳 ...

iterMap

// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; struct KeyStruct { string key; bool deleted; } struct ValueStruct { string value; bool isValue; uint index; //删除的时候会用到 } contract IteratorMap{ mapping(string => ValueStruct) dataMa ...

map

// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0 <0.9.0; contract Map { mapping(int256 => string) dataMap; constructor(){ dataMap[1] = "a"; } function get(int256 k) external view returns (string memory){ return dataMap[k]; ...

solidity数组

在 Solidity 中,只有 storage 类型有动态数组。memory 类型的数组必须有固定长度,并且不允许使用push()来附加元素。 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; contract MyArray { int256 [] intArr; int256 [3] intArr2; int256 [2][] intArr3; constructor(){ intArr3 = new int[2][]( ...

solidity存储

存储:每个账户有一块持久化内存区。将256位字映射到256位字的键值存储区。 在合约中枚举存储是不可能的,且读存储的相对开销很高,修改存储的开销甚至更高。合约只能读写存储区内属于自己的部分。 内存:合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。 内存是线性的,可按字节级寻址,但读的长度被限制为256位,而写的长度可以是8位或256位。当访问(无论是读还是写)之前从未访问过的内存字(word)时(无论是偏移到该字内的任何位置),内存将按字进行扩展(每个字是256位)。扩容也将消耗一定的gas。 随着内存使用量的增长,其费用也会增高(以平方级别)。 EVM:不是基于寄存器的,而是基 ...
Global site tag (gtag.js) - Google Analytics