github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/core/rawdb/accessors_indexes.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2018 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package rawdb 26 27 import ( 28 "github.com/ethereum/go-ethereum/common" 29 "github.com/ethereum/go-ethereum/core/types" 30 "github.com/ethereum/go-ethereum/log" 31 "github.com/ethereum/go-ethereum/rlp" 32 ) 33 34 //Read TxLoopUpTeAccess检索与事务关联的位置元数据 35 //哈希以允许按哈希检索事务或收据。 36 func ReadTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, uint64) { 37 data, _ := db.Get(txLookupKey(hash)) 38 if len(data) == 0 { 39 return common.Hash{}, 0, 0 40 } 41 var entry TxLookupEntry 42 if err := rlp.DecodeBytes(data, &entry); err != nil { 43 log.Error("Invalid transaction lookup entry RLP", "hash", hash, "err", err) 44 return common.Hash{}, 0, 0 45 } 46 return entry.BlockHash, entry.BlockIndex, entry.Index 47 } 48 49 //WraveTxLoopUpStand为每个事务存储位置元数据。 50 //一个块,启用基于哈希的事务和收据查找。 51 func WriteTxLookupEntries(db DatabaseWriter, block *types.Block) { 52 for i, tx := range block.Transactions() { 53 entry := TxLookupEntry{ 54 BlockHash: block.Hash(), 55 BlockIndex: block.NumberU64(), 56 Index: uint64(i), 57 } 58 data, err := rlp.EncodeToBytes(entry) 59 if err != nil { 60 log.Crit("Failed to encode transaction lookup entry", "err", err) 61 } 62 if err := db.Put(txLookupKey(tx.Hash()), data); err != nil { 63 log.Crit("Failed to store transaction lookup entry", "err", err) 64 } 65 } 66 } 67 68 //DeleteTxLookupEntry删除与哈希关联的所有事务数据。 69 func DeleteTxLookupEntry(db DatabaseDeleter, hash common.Hash) { 70 db.Delete(txLookupKey(hash)) 71 } 72 73 //readTransaction从数据库中检索特定事务,以及 74 //它添加了位置元数据。 75 func ReadTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { 76 blockHash, blockNumber, txIndex := ReadTxLookupEntry(db, hash) 77 if blockHash == (common.Hash{}) { 78 return nil, common.Hash{}, 0, 0 79 } 80 body := ReadBody(db, blockHash, blockNumber) 81 if body == nil || len(body.Transactions) <= int(txIndex) { 82 log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex) 83 return nil, common.Hash{}, 0, 0 84 } 85 return body.Transactions[txIndex], blockHash, blockNumber, txIndex 86 } 87 88 //readreceipt从数据库中检索特定的事务回执,以及 89 //它添加了位置元数据。 90 func ReadReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { 91 blockHash, blockNumber, receiptIndex := ReadTxLookupEntry(db, hash) 92 if blockHash == (common.Hash{}) { 93 return nil, common.Hash{}, 0, 0 94 } 95 receipts := ReadReceipts(db, blockHash, blockNumber) 96 if len(receipts) <= int(receiptIndex) { 97 log.Error("Receipt refereced missing", "number", blockNumber, "hash", blockHash, "index", receiptIndex) 98 return nil, common.Hash{}, 0, 0 99 } 100 return receipts[receiptIndex], blockHash, blockNumber, receiptIndex 101 } 102 103 //readBloomBits检索属于给定的 104 //中的节和位索引。 105 func ReadBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) ([]byte, error) { 106 return db.Get(bloomBitsKey(bit, section, head)) 107 } 108 109 //WriteBloomBits存储属于给定的 110 //节和位索引。 111 func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { 112 if err := db.Put(bloomBitsKey(bit, section, head), bits); err != nil { 113 log.Crit("Failed to store bloom bits", "err", err) 114 } 115 }