0%

ETH区块数据结构解析

区块的源码

1
// Block represents an entire block in the Ethereum blockchain.
2
type Block struct {
3
    header       *Header
4
    uncles       []*Header
5
    transactions Transactions
6
 
7
    // caches
8
    hash atomic.Value
9
    size atomic.Value
10
 
11
    // Td is used by package core to store the total difficulty
12
    // of the chain up to and including the block.
13
    td *big.Int
14
 
15
    // These fields are used by package eth to track
16
    // inter-peer block relay.
17
    ReceivedAt   time.Time
18
    ReceivedFrom interface{}
19
}
  • header:区块头,包含该区块的信息
  • uncles:该区块所包含的叔块的信息
  • transactions:该区块包含的交易信息
  • td:总难度,即从开始区块到本区块(包括本区块)所有的难度的累加
  • ReceivedAt:用于跟踪区块的生成
  • ReceivedFrom:用于跟踪区块的生成

结构图:

1
type Header struct {
2
    ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
3
    UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
4
    Coinbase    common.Address `json:"miner"            gencodec:"required"`
5
    Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
6
    TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
7
    ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
8
    Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
9
    Difficulty  *big.Int       `json:"difficulty"       gencodec:"required"`
10
    Number      *big.Int       `json:"number"           gencodec:"required"`
11
    GasLimit    uint64         `json:"gasLimit"         gencodec:"required"`
12
    GasUsed     uint64         `json:"gasUsed"          gencodec:"required"`
13
    Time        *big.Int       `json:"timestamp"        gencodec:"required"`
14
    Extra       []byte         `json:"extraData"        gencodec:"required"`
15
    MixDigest   common.Hash    `json:"mixHash"          gencodec:"required"`
16
    Nonce       BlockNonce     `json:"nonce"            gencodec:"required"`
17
}
18
19
type Body struct {
20
    Transactions []*Transaction
21
    Uncles       []*Header
22
}

ETH_block

各部分代表的含义

  • ParentHash:父区块的哈希值
  • UncleHash:上面提到的uncles的RLP哈希值,uncles是一个Header数组
  • Coinbase:挖出该区块矿工的地址,矿工费和挖出区块的奖励会发放到该地址
  • Root:存储账户状态的Merkle树的根节点的哈希
  • TxHash:存储该区块中交易的Merkle树的根节点的哈希
  • ReceiptHash:存储该区块的交易的回单的Merkle树的根节点的哈希,Block的所有Transaction执行完后会生成一个Receipt数组
  • Bloom:交易日志的布隆过滤器,用于查询
  • Difficulty:区块的难度
  • Number:区块高度
  • Time:挖出该区块的时间戳
  • GasLimit:区块内所有Gas消耗的上限
  • GasUsed:执行区块内所有Transaction实际消耗的Gas总和
  • Nonce:一个64bit的哈希数,用于工作量证明
  • mixDigest:该哈希值与Nonce值一起证明该区块上已经进行了足够的计算,用于证明挖矿成功
  • Extra:预留备用

小结

以太坊各个方面我也不太清楚,只能靠着自己了解的写一下,transaction的结构图没有给出,慢慢来吧,等我了解清楚再更新!

Transaction

1
//core/types/transaction.go
2
type Transaction struct {
3
    data txdata
4
    // caches
5
    hash atomic.Value
6
    size atomic.Value
7
    from atomic.Value
8
}
9
10
type txdata struct {
11
    AccountNonce uint64          `json:"nonce"    gencodec:"required"`
12
    Price        *big.Int        `json:"gasPrice" gencodec:"required"`
13
    GasLimit     uint64          `json:"gas"      gencodec:"required"`
14
    Recipient    *common.Address `json:"to"       rlp:"nil"` // nil means contract creation
15
    Amount       *big.Int        `json:"value"    gencodec:"required"`
16
    Payload      []byte          `json:"input"    gencodec:"required"`
17
18
    // Signature values
19
    V *big.Int `json:"v" gencodec:"required"`
20
    R *big.Int `json:"r" gencodec:"required"`
21
    S *big.Int `json:"s" gencodec:"required"`
22
23
    // This is only used when marshaling to JSON.
24
    Hash *common.Hash `json:"hash" rlp:"-"`
25
}

ETH_transaction

trsansaction及txdata中各个部分的含义

transaction

  • data 它的格式是txdata,是交易所包含的数据txdata中详细讲
  • hash、size、from是缓存

txdata

  • AccountNonce:此交易的发送者已发送过的交易数
  • Price:此交易的 gas price
  • GasLimit:本交易允许消耗的最大 gas 数量
  • Recipient:交易的接收者地址
  • Amount:交易转移的以太币数量,单位是 wei
  • Payload:交易可以携带的数据,在不同类型的交易中有不同的含义
  • V R S:交易的签名数据

总结

我感觉ETH的整个交易过程好复杂,没有静下心来好好研究下,有很多东西也是一窍不通,通过以上的总结,以太坊的区块结构大体解析的差不多了,还有很多东西值得研究,比如它使用的树的结构:Merkle-PatriciaTrie,以后再细细品味吧!

-------------本文结束感谢您的阅读-------------
#