以太坊之二以太坊数据结构

正在学习区块链,如果我哪里有错误希望大家指出,如果有任何想法也欢迎留言。这些笔记本身是在typora上写的,如果有显示不正确的敬请谅解。笔记本身也是给我自己写的,所以如果有侵权的请通知我,我立即删除。

2. 以太坊数据结构

2.1 本地数据结构

下图是本地存储的以太坊数据结构

// 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:指向叔叔节点的指针数组

transaction:交易的列表(以太坊中交易不是放在块头的吗)

2.2 区块头结构

// 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        uint64         `json:"timestamp"        gencodec:"required"`
    Extra       []byte         `json:"extraData"        gencodec:"required"`
    MixDigest   common.Hash    `json:"mixHash"`
    Nonce       BlockNonce     `json:"nonce"`
}

ParentHash:是父区块的哈希值,就是前一个区块块头的哈希值。

UncleHash:叔叔区块的哈希值

Coinbase:矿工的原始地址,和比特币一样

Root:状态树根哈希

TxHash:交易树根哈希

ReceiptHash:收据树根哈希

Bloom:布隆过滤器

Difficulty:挖矿难度

GasLimit:是这个区块中更够消耗的区块上限,类似于比特币中的1M限制。为了防止某些区块太大,对整个网络产生影响。这个值需要调整的时候调整范围是上一个区块的正负1024/1。比特币中分叉很多都是对1M空间理解不一致导致的,现在你觉得大你就下调,你觉得小就上调。虽然1024/1看起来很小,但是以太币出块时间很短,所以还是很快就能达到一个大多数矿工都能认可的平均大小。

GasUsed:整个区块中所有交易的汽油费之和。

Time:大致时间戳

Extra

MixDigest:挖矿相关

Nonce:和挖矿相关

2.3 实际上传的以太坊数据

// "external" block encoding. used for eth protocol, etc.
type extblock struct {
    Header *Header
    Txs    []*Transaction
    Uncles []*Header
}

真正上传的时候只传前三项,但是如果仅传指针,数据呢?我还不清楚。

2.4 RLP(Recursive Length Prefix)序列化

我最早接触序列化是在左神的二叉树序列化中,那个的目的就是把一种复杂的数据变成一种方便传输的结构,例如Json和xml都是,不过他们都是文本形式的,RLP是面向字节流的。

肖老师在讲的时候提到了一种比较常用的方式,叫protocal buffer,也有叫protobuf的,具体可以百度。至于RLP,是一种非常简单的结构,包括哈希、整数等一切类型都会转换成字符数组。具体的可以百度,很多很多,或者看github上的以太坊wiki。

RLP

发布了38 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qigezuishuaide/article/details/104244587