forked from mirror/go-ethereum
parent
cefe5c80b1
commit
30f057aaf9
@ -0,0 +1,95 @@ |
|||||||
|
package filters |
||||||
|
|
||||||
|
import ( |
||||||
|
"math/big" |
||||||
|
"os" |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common" |
||||||
|
"github.com/ethereum/go-ethereum/core" |
||||||
|
"github.com/ethereum/go-ethereum/core/types" |
||||||
|
"github.com/ethereum/go-ethereum/core/vm" |
||||||
|
"github.com/ethereum/go-ethereum/crypto" |
||||||
|
"github.com/ethereum/go-ethereum/ethdb" |
||||||
|
) |
||||||
|
|
||||||
|
func makeReceipt(addr common.Address) *types.Receipt { |
||||||
|
receipt := types.NewReceipt(nil, new(big.Int)) |
||||||
|
receipt.SetLogs(vm.Logs{ |
||||||
|
&vm.Log{Address: addr}, |
||||||
|
}) |
||||||
|
receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) |
||||||
|
return receipt |
||||||
|
} |
||||||
|
|
||||||
|
func BenchmarkMipmaps(b *testing.B) { |
||||||
|
const dbname = "/tmp/mipmap" |
||||||
|
var ( |
||||||
|
db, _ = ethdb.NewLDBDatabase(dbname, 16) |
||||||
|
key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") |
||||||
|
addr1 = crypto.PubkeyToAddress(key1.PublicKey) |
||||||
|
addr2 = common.BytesToAddress([]byte("jeff")) |
||||||
|
addr3 = common.BytesToAddress([]byte("ethereum")) |
||||||
|
addr4 = common.BytesToAddress([]byte("random addresses please")) |
||||||
|
) |
||||||
|
defer func() { |
||||||
|
db.Close() |
||||||
|
os.Remove(dbname) |
||||||
|
}() |
||||||
|
|
||||||
|
genesis := core.WriteGenesisBlockForTesting(db, core.GenesisAccount{addr1, big.NewInt(1000000)}) |
||||||
|
chain := core.GenerateChain(genesis, db, 100000, func(i int, gen *core.BlockGen) { |
||||||
|
var receipts types.Receipts |
||||||
|
switch i { |
||||||
|
case 2403: |
||||||
|
receipt := makeReceipt(addr1) |
||||||
|
receipts = types.Receipts{receipt} |
||||||
|
gen.AddReceipt(receipt) |
||||||
|
case 10340: |
||||||
|
receipt := makeReceipt(addr2) |
||||||
|
receipts = types.Receipts{receipt} |
||||||
|
gen.AddReceipt(receipt) |
||||||
|
case 34: |
||||||
|
receipt := makeReceipt(addr3) |
||||||
|
receipts = types.Receipts{receipt} |
||||||
|
gen.AddReceipt(receipt) |
||||||
|
case 99999: |
||||||
|
receipt := makeReceipt(addr4) |
||||||
|
receipts = types.Receipts{receipt} |
||||||
|
gen.AddReceipt(receipt) |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// store the receipts
|
||||||
|
err := core.PutReceipts(db, receipts) |
||||||
|
if err != nil { |
||||||
|
b.Fatal(err) |
||||||
|
} |
||||||
|
}) |
||||||
|
for _, block := range chain { |
||||||
|
core.WriteBlock(db, block) |
||||||
|
if err := core.WriteCanonicalHash(db, block.Hash(), block.NumberU64()); err != nil { |
||||||
|
b.Fatalf("failed to insert block number: %v", err) |
||||||
|
} |
||||||
|
if err := core.WriteHeadBlockHash(db, block.Hash()); err != nil { |
||||||
|
b.Fatalf("failed to insert block number: %v", err) |
||||||
|
} |
||||||
|
if err := core.PutBlockReceipts(db, block, block.Receipts()); err != nil { |
||||||
|
b.Fatal("error writing block receipts:", err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
b.ResetTimer() |
||||||
|
|
||||||
|
filter := New(db) |
||||||
|
filter.SetAddress([]common.Address{addr1, addr2, addr3, addr4}) |
||||||
|
filter.SetEarliestBlock(0) |
||||||
|
filter.SetLatestBlock(-1) |
||||||
|
|
||||||
|
for i := 0; i < b.N; i++ { |
||||||
|
logs := filter.Find() |
||||||
|
if len(logs) != 4 { |
||||||
|
b.Fatal("expected 4 log, got", len(logs)) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue