ETH源码阅读(存储Block的Receipts)

2018-09-20  本文已影响0人  坠叶飘香

1.流程图

存储Receipt

2.

构建key
r + number(区块高度) + hash(区块hash)

go-ethereum/core/rawdb/schema.go

//key:r + number + hash
// blockReceiptsKey = blockReceiptsPrefix + num (uint64 big endian) + hash
func blockReceiptsKey(number uint64, hash common.Hash) []byte {
    return append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...)
}
存入db

go-ethereum/core/rawdb/accessors_chain.go

// WriteReceipts stores all the transaction receipts belonging to a block.
func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) {
    // Convert the receipts into their storage form and serialize them
    //Receipt
    storageReceipts := make([]*types.ReceiptForStorage, len(receipts))
    for i, receipt := range receipts {
        storageReceipts[i] = (*types.ReceiptForStorage)(receipt)
    }
    bytes, err := rlp.EncodeToBytes(storageReceipts)
    if err != nil {
        log.Crit("Failed to encode block receipts", "err", err)
    }
    // Store the flattened receipt slice
    if err := db.Put(blockReceiptsKey(number, hash), bytes); err != nil {
        log.Crit("Failed to store block receipts", "err", err)
    }
}
上一篇 下一篇

猜你喜欢

热点阅读