Home 以太坊源码学习-数据结构
Post
Cancel

以太坊源码学习-数据结构

这篇学习下以太坊中使用的数据结构。

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,这个不太清楚什么用处?
This post is licensed under CC BY 4.0 by the author.
Contents