github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/eth/filters/filter_test.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 //版权所有2015 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 filters 26 27 import ( 28 "context" 29 "io/ioutil" 30 "math/big" 31 "os" 32 "testing" 33 34 "github.com/ethereum/go-ethereum/common" 35 "github.com/ethereum/go-ethereum/consensus/ethash" 36 "github.com/ethereum/go-ethereum/core" 37 "github.com/ethereum/go-ethereum/core/rawdb" 38 "github.com/ethereum/go-ethereum/core/types" 39 "github.com/ethereum/go-ethereum/crypto" 40 "github.com/ethereum/go-ethereum/ethdb" 41 "github.com/ethereum/go-ethereum/event" 42 "github.com/ethereum/go-ethereum/params" 43 ) 44 45 func makeReceipt(addr common.Address) *types.Receipt { 46 receipt := types.NewReceipt(nil, false, 0) 47 receipt.Logs = []*types.Log{ 48 {Address: addr}, 49 } 50 receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) 51 return receipt 52 } 53 54 func BenchmarkFilters(b *testing.B) { 55 dir, err := ioutil.TempDir("", "filtertest") 56 if err != nil { 57 b.Fatal(err) 58 } 59 defer os.RemoveAll(dir) 60 61 var ( 62 db, _ = ethdb.NewLDBDatabase(dir, 0, 0) 63 mux = new(event.TypeMux) 64 txFeed = new(event.Feed) 65 rmLogsFeed = new(event.Feed) 66 logsFeed = new(event.Feed) 67 chainFeed = new(event.Feed) 68 backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} 69 key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 70 addr1 = crypto.PubkeyToAddress(key1.PublicKey) 71 addr2 = common.BytesToAddress([]byte("jeff")) 72 addr3 = common.BytesToAddress([]byte("ethereum")) 73 addr4 = common.BytesToAddress([]byte("random addresses please")) 74 ) 75 defer db.Close() 76 77 genesis := core.GenesisBlockForTesting(db, addr1, big.NewInt(1000000)) 78 chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 100010, func(i int, gen *core.BlockGen) { 79 switch i { 80 case 2403: 81 receipt := makeReceipt(addr1) 82 gen.AddUncheckedReceipt(receipt) 83 case 1034: 84 receipt := makeReceipt(addr2) 85 gen.AddUncheckedReceipt(receipt) 86 case 34: 87 receipt := makeReceipt(addr3) 88 gen.AddUncheckedReceipt(receipt) 89 case 99999: 90 receipt := makeReceipt(addr4) 91 gen.AddUncheckedReceipt(receipt) 92 93 } 94 }) 95 for i, block := range chain { 96 rawdb.WriteBlock(db, block) 97 rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) 98 rawdb.WriteHeadBlockHash(db, block.Hash()) 99 rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), receipts[i]) 100 } 101 b.ResetTimer() 102 103 filter := NewRangeFilter(backend, 0, -1, []common.Address{addr1, addr2, addr3, addr4}, nil) 104 105 for i := 0; i < b.N; i++ { 106 logs, _ := filter.Logs(context.Background()) 107 if len(logs) != 4 { 108 b.Fatal("expected 4 logs, got", len(logs)) 109 } 110 } 111 } 112 113 func TestFilters(t *testing.T) { 114 dir, err := ioutil.TempDir("", "filtertest") 115 if err != nil { 116 t.Fatal(err) 117 } 118 defer os.RemoveAll(dir) 119 120 var ( 121 db, _ = ethdb.NewLDBDatabase(dir, 0, 0) 122 mux = new(event.TypeMux) 123 txFeed = new(event.Feed) 124 rmLogsFeed = new(event.Feed) 125 logsFeed = new(event.Feed) 126 chainFeed = new(event.Feed) 127 backend = &testBackend{mux, db, 0, txFeed, rmLogsFeed, logsFeed, chainFeed} 128 key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") 129 addr = crypto.PubkeyToAddress(key1.PublicKey) 130 131 hash1 = common.BytesToHash([]byte("topic1")) 132 hash2 = common.BytesToHash([]byte("topic2")) 133 hash3 = common.BytesToHash([]byte("topic3")) 134 hash4 = common.BytesToHash([]byte("topic4")) 135 ) 136 defer db.Close() 137 138 genesis := core.GenesisBlockForTesting(db, addr, big.NewInt(1000000)) 139 chain, receipts := core.GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 1000, func(i int, gen *core.BlockGen) { 140 switch i { 141 case 1: 142 receipt := types.NewReceipt(nil, false, 0) 143 receipt.Logs = []*types.Log{ 144 { 145 Address: addr, 146 Topics: []common.Hash{hash1}, 147 }, 148 } 149 gen.AddUncheckedReceipt(receipt) 150 case 2: 151 receipt := types.NewReceipt(nil, false, 0) 152 receipt.Logs = []*types.Log{ 153 { 154 Address: addr, 155 Topics: []common.Hash{hash2}, 156 }, 157 } 158 gen.AddUncheckedReceipt(receipt) 159 case 998: 160 receipt := types.NewReceipt(nil, false, 0) 161 receipt.Logs = []*types.Log{ 162 { 163 Address: addr, 164 Topics: []common.Hash{hash3}, 165 }, 166 } 167 gen.AddUncheckedReceipt(receipt) 168 case 999: 169 receipt := types.NewReceipt(nil, false, 0) 170 receipt.Logs = []*types.Log{ 171 { 172 Address: addr, 173 Topics: []common.Hash{hash4}, 174 }, 175 } 176 gen.AddUncheckedReceipt(receipt) 177 } 178 }) 179 for i, block := range chain { 180 rawdb.WriteBlock(db, block) 181 rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) 182 rawdb.WriteHeadBlockHash(db, block.Hash()) 183 rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), receipts[i]) 184 } 185 186 filter := NewRangeFilter(backend, 0, -1, []common.Address{addr}, [][]common.Hash{{hash1, hash2, hash3, hash4}}) 187 188 logs, _ := filter.Logs(context.Background()) 189 if len(logs) != 4 { 190 t.Error("expected 4 log, got", len(logs)) 191 } 192 193 filter = NewRangeFilter(backend, 900, 999, []common.Address{addr}, [][]common.Hash{{hash3}}) 194 logs, _ = filter.Logs(context.Background()) 195 if len(logs) != 1 { 196 t.Error("expected 1 log, got", len(logs)) 197 } 198 if len(logs) > 0 && logs[0].Topics[0] != hash3 { 199 t.Errorf("expected log[0].Topics[0] to be %x, got %x", hash3, logs[0].Topics[0]) 200 } 201 202 filter = NewRangeFilter(backend, 990, -1, []common.Address{addr}, [][]common.Hash{{hash3}}) 203 logs, _ = filter.Logs(context.Background()) 204 if len(logs) != 1 { 205 t.Error("expected 1 log, got", len(logs)) 206 } 207 if len(logs) > 0 && logs[0].Topics[0] != hash3 { 208 t.Errorf("expected log[0].Topics[0] to be %x, got %x", hash3, logs[0].Topics[0]) 209 } 210 211 filter = NewRangeFilter(backend, 1, 10, nil, [][]common.Hash{{hash1, hash2}}) 212 213 logs, _ = filter.Logs(context.Background()) 214 if len(logs) != 2 { 215 t.Error("expected 2 log, got", len(logs)) 216 } 217 218 failHash := common.BytesToHash([]byte("fail")) 219 filter = NewRangeFilter(backend, 0, -1, nil, [][]common.Hash{{failHash}}) 220 221 logs, _ = filter.Logs(context.Background()) 222 if len(logs) != 0 { 223 t.Error("expected 0 log, got", len(logs)) 224 } 225 226 failAddr := common.BytesToAddress([]byte("failmenow")) 227 filter = NewRangeFilter(backend, 0, -1, []common.Address{failAddr}, nil) 228 229 logs, _ = filter.Logs(context.Background()) 230 if len(logs) != 0 { 231 t.Error("expected 0 log, got", len(logs)) 232 } 233 234 filter = NewRangeFilter(backend, 0, -1, nil, [][]common.Hash{{failHash}, {hash1}}) 235 236 logs, _ = filter.Logs(context.Background()) 237 if len(logs) != 0 { 238 t.Error("expected 0 log, got", len(logs)) 239 } 240 }