这篇学习下以太坊中使用的数据结构。
header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Header represents a block header in the Ethereum blockchain.
type Header struct {
ParentHash common.Hash `json:"parentHash" gencodec:"required"`
UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"`
Coinbase common.Address `json:"miner" gencodec:"required"`
Root common.Hash `json:"stateRoot" gencodec:"required"`
TxHash common.Hash `json:"transactionsRoot" gencodec:"required"`
ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"`
Bloom Bloom `json:"logsBloom" gencodec:"required"`
Difficulty *big.Int `json:"difficulty" gencodec:"required"`
Number *big.Int `json:"number" gencodec:"required"`
GasLimit uint64 `json:"gasLimit" gencodec:"required"`
GasUsed uint64 `json:"gasUsed" gencodec:"required"`
Time *big.Int `json:"timestamp" gencodec:"required"`
Extra []byte `json:"extraData" gencodec:"required"`
MixDigest common.Hash `json:"mixHash"`
Nonce BlockNonce `json:"nonce"`
}
- ParentHash,父区块的区块头的 Hash,RLP 之后 Keccak256 得到。
- UncleHash,叔区块区块头的 Hash,RLP 之后 Keccak256 得到。
- Coinbase,挖到区块的地址
- Root,stateRoot,账户状态的 MPT 树根
- TxHash,transactionsRoot,交易状态的 MPT 树根
- ReceiptHash,receiptsRoot,收据状态的 MPT 树根
- Bloom,logsBloom,日记 Bloom 过滤器由可索引信息(日志地址和日志主题)组成,这个信息包含在每个日志入口
- Difficulty,difficulty,难度值
- Number,number,区块编号, 等于当前区块的直系前辈区块数量(创始区块的区块编号为0)
- GasLimit,gasLimit,目前每个区块的燃料消耗上限
- GasUsed,gasUsed,当前区块的所有交易使用燃料之和
- Time,当前时间戳
- Extra,额外的数据
- MixDigest,mixHash,混合哈希, 与一个与随机数 (nonce)相关的 256 位哈希计算, 用于证明针对当前区块已经完成了足够的计算
- Nonce,随机数
block
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Block represents an entire block in the Ethereum blockchain.
type Block struct {
header *Header
uncles []*Header
transactions Transactions
// caches
hash atomic.Value
size atomic.Value
// Td is used by package core to store the total difficulty
// of the chain up to and including the block.
td *big.Int
// These fields are used by package eth to track
// inter-peer block relay.
ReceivedAt time.Time
ReceivedFrom interface{}
}
- header,区块头指针
- uncles,叔区块的区块头指针
- transactons,所有的交易
- hash,区块头进行 RLP 之后求 hash 值
- size,区块头 RLP 之后的大小
- td,total difficulty,到目前为止总的难度值
- ReceivedAt,接收到区块的时间
- ReceivedFrom,从哪个节点接收到的区块
transactions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type Transaction struct {
data txdata
// caches
hash atomic.Value
size atomic.Value
from atomic.Value
}
type txdata struct {
AccountNonce uint64 `json:"nonce" gencodec:"required"`
Price *big.Int `json:"gasPrice" gencodec:"required"`
GasLimit uint64 `json:"gas" gencodec:"required"`
Recipient *common.Address `json:"to" rlp:"nil"` // nil means contract creation
Amount *big.Int `json:"value" gencodec:"required"`
Payload []byte `json:"input" gencodec:"required"`
// Signature values
V *big.Int `json:"v" gencodec:"required"`
R *big.Int `json:"r" gencodec:"required"`
S *big.Int `json:"s" gencodec:"required"`
// This is only used when marshaling to JSON.
Hash *common.Hash `json:"hash" rlp:"-"`
}
- hash,本交易的 RLP 的哈希
- size,本交易的 RLP 的大小
- from,交易的发起者
- data
- AccountNonce,账户的 nonce 值,账户模型中为了消除重复交易
- Price,gasPrice,交易的 gas 价格
- GasLimint,gas 上限
- Recipient,收款方地址
- Amoount,转账金额
- Payload,合约代码或者输入参数
- V,R,S,属于签名数据,通过这三个可以推算出公钥,也就可以算出 from
- Hash,这个不太清楚什么用处?