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