区块的源码
1 |
|
2 | type Block struct { |
3 | header *Header |
4 | uncles []*Header |
5 | transactions Transactions |
6 | |
7 | |
8 | hash atomic.Value |
9 | size atomic.Value |
10 | |
11 | |
12 | |
13 | td *big.Int |
14 | |
15 | |
16 | |
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 | } |
各部分代表的含义
- 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 |
|
2 | type Transaction struct { |
3 | data txdata |
4 | |
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"` |
15 | Amount *big.Int `json:"value" gencodec:"required"` |
16 | Payload []byte `json:"input" gencodec:"required"` |
17 |
|
18 | |
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 | |
24 | Hash *common.Hash `json:"hash" rlp:"-"` |
25 | } |
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,以后再细细品味吧!