aboutsummaryrefslogtreecommitdiffstats
path: root/core/blockchain_test.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2018-04-10 17:28:30 +0800
committerGitHub <noreply@github.com>2018-04-10 17:28:30 +0800
commit39f4c80155b891643b098f99edd0e630e16a5f99 (patch)
tree5c8fcbbcb5b7c0159f9416a9dd33653d4f5c0984 /core/blockchain_test.go
parent1100e8ba633d968da8ae2caca0a5d0cf48bcfa92 (diff)
parent8c31d2897ba6bf32097dffcd1bbe899172396533 (diff)
downloadgo-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.tar
go-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.tar.gz
go-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.tar.bz2
go-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.tar.lz
go-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.tar.xz
go-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.tar.zst
go-tangerine-39f4c80155b891643b098f99edd0e630e16a5f99.zip
Merge pull request #15225 from holiman/test_removefrom_dirtyset
Change handling of dirty objects in state
Diffstat (limited to 'core/blockchain_test.go')
-rw-r--r--core/blockchain_test.go111
1 files changed, 111 insertions, 0 deletions
diff --git a/core/blockchain_test.go b/core/blockchain_test.go
index 748cdc5c7..375823b57 100644
--- a/core/blockchain_test.go
+++ b/core/blockchain_test.go
@@ -1338,3 +1338,114 @@ func TestLargeReorgTrieGC(t *testing.T) {
}
}
}
+
+// Benchmarks large blocks with value transfers to non-existing accounts
+func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks int, recipientFn func(uint64) common.Address, dataFn func(uint64) []byte) {
+ var (
+ signer = types.HomesteadSigner{}
+ testBankKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
+ testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey)
+ bankFunds = big.NewInt(100000000000000000)
+ gspec = Genesis{
+ Config: params.TestChainConfig,
+ Alloc: GenesisAlloc{
+ testBankAddress: {Balance: bankFunds},
+ common.HexToAddress("0xc0de"): {
+ Code: []byte{0x60, 0x01, 0x50},
+ Balance: big.NewInt(0),
+ }, // push 1, pop
+ },
+ GasLimit: 100e6, // 100 M
+ }
+ )
+ // Generate the original common chain segment and the two competing forks
+ engine := ethash.NewFaker()
+ db, _ := ethdb.NewMemDatabase()
+ genesis := gspec.MustCommit(db)
+
+ blockGenerator := func(i int, block *BlockGen) {
+ block.SetCoinbase(common.Address{1})
+ for txi := 0; txi < numTxs; txi++ {
+ uniq := uint64(i*numTxs + txi)
+ recipient := recipientFn(uniq)
+ //recipient := common.BigToAddress(big.NewInt(0).SetUint64(1337 + uniq))
+ tx, err := types.SignTx(types.NewTransaction(uniq, recipient, big.NewInt(1), params.TxGas, big.NewInt(1), nil), signer, testBankKey)
+ if err != nil {
+ b.Error(err)
+ }
+ block.AddTx(tx)
+ }
+ }
+
+ shared, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, numBlocks, blockGenerator)
+ b.StopTimer()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ // Import the shared chain and the original canonical one
+ diskdb, _ := ethdb.NewMemDatabase()
+ gspec.MustCommit(diskdb)
+
+ chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{})
+ if err != nil {
+ b.Fatalf("failed to create tester chain: %v", err)
+ }
+ b.StartTimer()
+ if _, err := chain.InsertChain(shared); err != nil {
+ b.Fatalf("failed to insert shared chain: %v", err)
+ }
+ b.StopTimer()
+ if got := chain.CurrentBlock().Transactions().Len(); got != numTxs*numBlocks {
+ b.Fatalf("Transactions were not included, expected %d, got %d", (numTxs * numBlocks), got)
+
+ }
+ }
+}
+func BenchmarkBlockChain_1x1000ValueTransferToNonexisting(b *testing.B) {
+ var (
+ numTxs = 1000
+ numBlocks = 1
+ )
+
+ recipientFn := func(nonce uint64) common.Address {
+ return common.BigToAddress(big.NewInt(0).SetUint64(1337 + nonce))
+ }
+ dataFn := func(nonce uint64) []byte {
+ return nil
+ }
+
+ benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn)
+}
+func BenchmarkBlockChain_1x1000ValueTransferToExisting(b *testing.B) {
+ var (
+ numTxs = 1000
+ numBlocks = 1
+ )
+ b.StopTimer()
+ b.ResetTimer()
+
+ recipientFn := func(nonce uint64) common.Address {
+ return common.BigToAddress(big.NewInt(0).SetUint64(1337))
+ }
+ dataFn := func(nonce uint64) []byte {
+ return nil
+ }
+
+ benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn)
+}
+func BenchmarkBlockChain_1x1000Executions(b *testing.B) {
+ var (
+ numTxs = 1000
+ numBlocks = 1
+ )
+ b.StopTimer()
+ b.ResetTimer()
+
+ recipientFn := func(nonce uint64) common.Address {
+ return common.BigToAddress(big.NewInt(0).SetUint64(0xc0de))
+ }
+ dataFn := func(nonce uint64) []byte {
+ return nil
+ }
+
+ benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn)
+}