- 浏览: 763654 次
- 性别:
- 来自: 深圳
文章列表
每一个以太坊的区块头包含三颗MPT树,分别是
交易树
收据树(交易执行过程中的一些数据)
状态树(账号信息, 合约账户和用户账户)
从编码来说,有三种编码:
Raw编码:原生的key编码,是MPT对外提供接口中使用的编码方式,当数据项被插入到树中时,Raw编码被转换成Hex编码;
Hex编码:16进制扩展编码,用于对内存中树节点key进行编码,当树节点被持久化到数据库时,Hex编码被转换成HP编码;
HP编码:16进制前缀编码,用于对数据库中树节点key进行编码,当树节点被加载到内存时,HP编码被转换成Hex编码;
Trie树的插入,这是一个递归调用的方法,从根节点开始,一直往下找,直到 ...
库和合约的区别在于库不能有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 ...
接口类似于抽象合约,但是它们不能实现任何函数。还有进一步的限制:
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 ...
// 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
- 博客分类:
- solidity
// 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的函数才可以重写(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变量会自动生成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 ...
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 起始当前区块以秒计的时间戳 ...
// 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 ...
// 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
在 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存储
- 博客分类:
- solidity
存储:每个账户有一块持久化内存区。将256位字映射到256位字的键值存储区。 在合约中枚举存储是不可能的,且读存储的相对开销很高,修改存储的开销甚至更高。合约只能读写存储区内属于自己的部分。
内存:合约会试图为每一次消息调用获取一块被重新擦拭干净的内存实例。 内存是线性的,可按字节级寻址,但读的长度被限制为256位,而写的长度可以是8位或256位。当访问(无论是读还是写)之前从未访问过的内存字(word)时(无论是偏移到该字内的任何位置),内存将按字进行扩展(每个字是256位)。扩容也将消耗一定的gas。 随着内存使用量的增长,其费用也会增高(以平方级别)。
EVM:不是基于寄存器的,而是基 ...