github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/eth/downloader/fakepeer.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 //版权所有2017 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 downloader 26 27 import ( 28 "math/big" 29 30 "github.com/ethereum/go-ethereum/common" 31 "github.com/ethereum/go-ethereum/core" 32 "github.com/ethereum/go-ethereum/core/rawdb" 33 "github.com/ethereum/go-ethereum/core/types" 34 "github.com/ethereum/go-ethereum/ethdb" 35 ) 36 37 //FakePeer是一个模拟下载程序对等机,在本地数据库实例上运行。 38 //而不是实际的活动节点。它对测试和实现很有用 39 //从现有本地数据库同步命令。 40 type FakePeer struct { 41 id string 42 db ethdb.Database 43 hc *core.HeaderChain 44 dl *Downloader 45 } 46 47 //newfakepeer用给定的数据源创建一个新的模拟下载器对等。 48 func NewFakePeer(id string, db ethdb.Database, hc *core.HeaderChain, dl *Downloader) *FakePeer { 49 return &FakePeer{id: id, db: db, hc: hc, dl: dl} 50 } 51 52 //head实现downloader.peer,返回当前head哈希和数字 53 //最著名的标题。 54 func (p *FakePeer) Head() (common.Hash, *big.Int) { 55 header := p.hc.CurrentHeader() 56 return header.Hash(), header.Number 57 } 58 59 //requestHeadersByHash实现downloader.peer,返回一批头 60 //由源哈希和关联的查询参数定义。 61 func (p *FakePeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, reverse bool) error { 62 var ( 63 headers []*types.Header 64 unknown bool 65 ) 66 for !unknown && len(headers) < amount { 67 origin := p.hc.GetHeaderByHash(hash) 68 if origin == nil { 69 break 70 } 71 number := origin.Number.Uint64() 72 headers = append(headers, origin) 73 if reverse { 74 for i := 0; i <= skip; i++ { 75 if header := p.hc.GetHeader(hash, number); header != nil { 76 hash = header.ParentHash 77 number-- 78 } else { 79 unknown = true 80 break 81 } 82 } 83 } else { 84 var ( 85 current = origin.Number.Uint64() 86 next = current + uint64(skip) + 1 87 ) 88 if header := p.hc.GetHeaderByNumber(next); header != nil { 89 if p.hc.GetBlockHashesFromHash(header.Hash(), uint64(skip+1))[skip] == hash { 90 hash = header.Hash() 91 } else { 92 unknown = true 93 } 94 } else { 95 unknown = true 96 } 97 } 98 } 99 p.dl.DeliverHeaders(p.id, headers) 100 return nil 101 } 102 103 //requestHeadersByNumber实现downloader.peer,返回一批头 104 //由原点编号和关联的查询参数定义。 105 func (p *FakePeer) RequestHeadersByNumber(number uint64, amount int, skip int, reverse bool) error { 106 var ( 107 headers []*types.Header 108 unknown bool 109 ) 110 for !unknown && len(headers) < amount { 111 origin := p.hc.GetHeaderByNumber(number) 112 if origin == nil { 113 break 114 } 115 if reverse { 116 if number >= uint64(skip+1) { 117 number -= uint64(skip + 1) 118 } else { 119 unknown = true 120 } 121 } else { 122 number += uint64(skip + 1) 123 } 124 headers = append(headers, origin) 125 } 126 p.dl.DeliverHeaders(p.id, headers) 127 return nil 128 } 129 130 //请求体实现downloader.peer,返回一批块体 131 //对应于指定的块散列。 132 func (p *FakePeer) RequestBodies(hashes []common.Hash) error { 133 var ( 134 txs [][]*types.Transaction 135 uncles [][]*types.Header 136 ) 137 for _, hash := range hashes { 138 block := rawdb.ReadBlock(p.db, hash, *p.hc.GetBlockNumber(hash)) 139 140 txs = append(txs, block.Transactions()) 141 uncles = append(uncles, block.Uncles()) 142 } 143 p.dl.DeliverBodies(p.id, txs, uncles) 144 return nil 145 } 146 147 //requestReceipts实现downloader.peer,返回一批事务 148 //与指定的块哈希相对应的收据。 149 func (p *FakePeer) RequestReceipts(hashes []common.Hash) error { 150 var receipts [][]*types.Receipt 151 for _, hash := range hashes { 152 receipts = append(receipts, rawdb.ReadReceipts(p.db, hash, *p.hc.GetBlockNumber(hash))) 153 } 154 p.dl.DeliverReceipts(p.id, receipts) 155 return nil 156 } 157 158 //requestNodeData实现downloader.peer,返回一批状态trie 159 //与指定的trie散列对应的节点。 160 func (p *FakePeer) RequestNodeData(hashes []common.Hash) error { 161 var data [][]byte 162 for _, hash := range hashes { 163 if entry, err := p.db.Get(hash.Bytes()); err == nil { 164 data = append(data, entry) 165 } 166 } 167 p.dl.DeliverNodeData(p.id, data) 168 return nil 169 }