From 2756eedd27094cd1f7c7c2fdf64f359df15baaf6 Mon Sep 17 00:00:00 2001 From: jonny rhea <5555162+jrhea@users.noreply.github.com> Date: Mon, 6 Jul 2026 16:36:39 -0500 Subject: [PATCH] remove benchmarks --- core/bench_test.go | 115 ------------------ core/vm/runtime/evm_bench_test.go | 106 ---------------- core/vm/runtime/testdata/erc20approval.hex | 1 - core/vm/runtime/testdata/erc20mint.hex | 1 - core/vm/runtime/testdata/erc20transfer.hex | 1 - core/vm/runtime/testdata/evm-bench/README.md | 73 ----------- .../testdata/evm-bench/TenThousandHashes.sol | 17 --- core/vm/runtime/testdata/evm-bench/compare.sh | 62 ---------- core/vm/runtime/testdata/evm-bench/gen.sh | 52 -------- core/vm/runtime/testdata/snailtracer.hex | 1 - .../vm/runtime/testdata/tenthousandhashes.hex | 1 - 11 files changed, 430 deletions(-) delete mode 100644 core/vm/runtime/evm_bench_test.go delete mode 100644 core/vm/runtime/testdata/erc20approval.hex delete mode 100644 core/vm/runtime/testdata/erc20mint.hex delete mode 100644 core/vm/runtime/testdata/erc20transfer.hex delete mode 100644 core/vm/runtime/testdata/evm-bench/README.md delete mode 100644 core/vm/runtime/testdata/evm-bench/TenThousandHashes.sol delete mode 100755 core/vm/runtime/testdata/evm-bench/compare.sh delete mode 100755 core/vm/runtime/testdata/evm-bench/gen.sh delete mode 100644 core/vm/runtime/testdata/snailtracer.hex delete mode 100644 core/vm/runtime/testdata/tenthousandhashes.hex diff --git a/core/bench_test.go b/core/bench_test.go index 4e3923e4fe..47b991e5a3 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -18,12 +18,7 @@ package core import ( "crypto/ecdsa" - "encoding/binary" - "encoding/hex" "math/big" - "os" - "path/filepath" - "strings" "testing" "github.com/ethereum/go-ethereum/common" @@ -73,12 +68,6 @@ func BenchmarkInsertChain_ring1000_memdb(b *testing.B) { func BenchmarkInsertChain_ring1000_diskdb(b *testing.B) { benchInsertChain(b, true, genTxRing(1000)) } -func BenchmarkInsertChain_evmWorkload_memdb(b *testing.B) { - benchInsertChainEVM(b, false) -} -func BenchmarkInsertChain_evmWorkload_diskdb(b *testing.B) { - benchInsertChainEVM(b, true) -} var ( // This is the content of the genesis block used by the benchmarks. @@ -219,110 +208,6 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { } } -// The evmWorkload addresses hold the evm-bench contracts (see -// core/vm/runtime/testdata), installed through the genesis alloc. Their -// runtime bytecode sets up all state inside Benchmark(), so no constructor -// runs. -var benchWorkloadAddrs = []common.Address{ - common.HexToAddress("0x00000000000000000000000000000000000e0001"), // ERC20Transfer - common.HexToAddress("0x00000000000000000000000000000000000e0002"), // ERC20Mint - common.HexToAddress("0x00000000000000000000000000000000000e0003"), // ERC20ApprovalTransfer - common.HexToAddress("0x00000000000000000000000000000000000e0004"), // TenThousandHashes -} - -func benchWorkloadCode(tb testing.TB) [][]byte { - files := []string{"erc20transfer.hex", "erc20mint.hex", "erc20approval.hex", "tenthousandhashes.hex"} - codes := make([][]byte, len(files)) - for i, name := range files { - raw, err := os.ReadFile(filepath.Join("vm", "runtime", "testdata", name)) - if err != nil { - tb.Fatal(err) - } - code, err := hex.DecodeString(strings.TrimSpace(string(raw))) - if err != nil { - tb.Fatal(err) - } - codes[i] = code - } - return codes -} - -// benchInsertChainEVM measures InsertChain over blocks dominated by real -// contract execution, as a coarse local surrogate for sync throughput: the -// timed path is full block processing, including sender recovery, EVM -// execution, state updates, receipts, bloom filters and the state root. -// Every block invokes the four evm-bench workloads (ERC-20 transfer, mint -// and approval loops plus a keccak loop) and sends ten value transfers to -// fresh accounts so the state grows as it would during sync. Reports Mgas/s -// alongside the standard timings. -func benchInsertChainEVM(b *testing.B, disk bool) { - var db ethdb.Database - if !disk { - db = rawdb.NewMemoryDatabase() - } else { - pdb, err := pebble.New(b.TempDir(), 128, 128, "", false) - if err != nil { - b.Fatalf("cannot create temporary database: %v", err) - } - db = rawdb.NewDatabase(pdb) - defer db.Close() - } - alloc := types.GenesisAlloc{benchRootAddr: {Balance: benchRootFunds}} - for i, code := range benchWorkloadCode(b) { - alloc[benchWorkloadAddrs[i]] = types.Account{Code: code, Balance: new(big.Int)} - } - gspec := &Genesis{ - Config: params.TestChainConfig, - Alloc: alloc, - GasLimit: 150_000_000, - } - selector := []byte{0x30, 0x62, 0x7b, 0x7c} // Benchmark() - _, chain, _ := GenerateChainWithGenesis(gspec, ethash.NewFaker(), b.N, func(i int, gen *BlockGen) { - signer := gen.Signer() - gasPrice := big.NewInt(0) - if gen.header.BaseFee != nil { - gasPrice = gen.header.BaseFee - } - for _, addr := range benchWorkloadAddrs { - to := addr - tx, _ := types.SignNewTx(benchRootKey, signer, &types.LegacyTx{ - Nonce: gen.TxNonce(benchRootAddr), - To: &to, - Gas: 30_000_000, - Data: selector, - GasPrice: gasPrice, - }) - gen.AddTx(tx) - } - for j := 0; j < 10; j++ { - var to common.Address - binary.BigEndian.PutUint64(to[4:12], uint64(i+1)) - binary.BigEndian.PutUint64(to[12:20], uint64(j+1)) - tx, _ := types.SignNewTx(benchRootKey, signer, &types.LegacyTx{ - Nonce: gen.TxNonce(benchRootAddr), - To: &to, - Value: big.NewInt(1), - Gas: params.TxGas, - GasPrice: gasPrice, - }) - gen.AddTx(tx) - } - }) - var totalGas uint64 - for _, block := range chain { - totalGas += block.GasUsed() - } - chainman, _ := NewBlockChain(db, gspec, ethash.NewFaker(), nil) - defer chainman.Stop() - b.ReportAllocs() - b.ResetTimer() - if i, err := chainman.InsertChain(chain); err != nil { - b.Fatalf("insert error (block %d): %v\n", i, err) - } - b.StopTimer() - b.ReportMetric(float64(totalGas)/1e6/b.Elapsed().Seconds(), "Mgas/s") -} - func BenchmarkChainRead_header_10k(b *testing.B) { benchReadChain(b, false, 10000) } diff --git a/core/vm/runtime/evm_bench_test.go b/core/vm/runtime/evm_bench_test.go deleted file mode 100644 index 31a265c1f6..0000000000 --- a/core/vm/runtime/evm_bench_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2026 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Whole-contract interpreter benchmarks from the evm-bench suite -// (github.com/ziyadedher/evm-bench). Each contract exposes a Benchmark() -// entrypoint (selector 0x30627b7c) that performs the whole workload internally -// (e.g. 5000 mints), so the benchmark is a single Call per iteration. These -// complement the opcode/loop micro-benchmarks in runtime_test.go with realistic -// workloads (a ray tracer, ERC-20 transfer/mint/approval, a hashing loop) and -// use the same names as evm-bench / gevm for cross-comparison. -// -// Run: go test ./core/vm/runtime/ -run '^$' -bench 'Benchmark(Snailtracer|TenThousandHashes|ERC20)' -benchmem -count=10 -// Compare A/B: ./core/vm/runtime/testdata/evm-bench/compare.sh -// -// The committed runtime bytecode in testdata/*.hex is regenerated by -// testdata/evm-bench/gen.sh (solc via docker). See that script for provenance -// and exact compiler versions. - -package runtime - -import ( - _ "embed" - "encoding/hex" - "strings" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/state" - "github.com/ethereum/go-ethereum/core/tracing" - "github.com/ethereum/go-ethereum/core/types" - "github.com/holiman/uint256" -) - -//go:embed testdata/snailtracer.hex -var benchSnailtracerHex string - -//go:embed testdata/tenthousandhashes.hex -var benchTenThousandHashesHex string - -//go:embed testdata/erc20transfer.hex -var benchERC20TransferHex string - -//go:embed testdata/erc20mint.hex -var benchERC20MintHex string - -//go:embed testdata/erc20approval.hex -var benchERC20ApprovalHex string - -// benchmarkSelector is keccak256("Benchmark()")[:4], the evm-bench entrypoint. -var benchmarkSelector = []byte{0x30, 0x62, 0x7b, 0x7c} - -func benchHexToBytes(s string) []byte { - b, err := hex.DecodeString(strings.TrimSpace(s)) - if err != nil { - panic(err) - } - return b -} - -// runEVMBench deploys the contract's runtime bytecode and repeatedly invokes its -// Benchmark() entrypoint. The contract's constructor is not run, so storage -// starts empty. The evm-bench contracts set up whatever state they need inside -// Benchmark(), which matches the work the evm-bench harness measures. -func runEVMBench(b *testing.B, codeHex string) { - code := benchHexToBytes(codeHex) - statedb, err := state.New(types.EmptyRootHash, state.NewDatabaseForTesting()) - if err != nil { - b.Fatal(err) - } - contract := common.BytesToAddress([]byte{0x10}) - caller := common.BytesToAddress([]byte{0x01}) - statedb.CreateAccount(caller) - statedb.AddBalance(caller, uint256.NewInt(1_000_000_000), tracing.BalanceChangeUnspecified) - statedb.SetCode(contract, code, tracing.CodeChangeUnspecified) - - cfg := &Config{Origin: caller, State: statedb, GasLimit: 10_000_000_000} - - // Sanity: the workload must run to completion, not revert/out-of-gas. - if _, _, err := Call(contract, benchmarkSelector, cfg); err != nil { - b.Fatalf("Benchmark() did not complete: %v", err) - } - b.ReportAllocs() - b.ResetTimer() - for b.Loop() { - Call(contract, benchmarkSelector, cfg) - } -} - -func BenchmarkSnailtracer(b *testing.B) { runEVMBench(b, benchSnailtracerHex) } -func BenchmarkTenThousandHashes(b *testing.B) { runEVMBench(b, benchTenThousandHashesHex) } -func BenchmarkERC20Transfer(b *testing.B) { runEVMBench(b, benchERC20TransferHex) } -func BenchmarkERC20Mint(b *testing.B) { runEVMBench(b, benchERC20MintHex) } -func BenchmarkERC20ApprovalTransfer(b *testing.B) { runEVMBench(b, benchERC20ApprovalHex) } diff --git a/core/vm/runtime/testdata/erc20approval.hex b/core/vm/runtime/testdata/erc20approval.hex deleted file mode 100644 index 0700413573..0000000000 --- a/core/vm/runtime/testdata/erc20approval.hex +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b50600436106100b45760003560e01c80633950935111610071578063395093511461013857806370a082311461014b57806395d89b4114610174578063a457c2d71461017c578063a9059cbb1461018f578063dd62ed3e146101a257600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100fa57806323b872dd1461010c57806330627b7c1461011f578063313ce56714610129575b600080fd5b6100c16101b5565b6040516100ce91906108ca565b60405180910390f35b6100ea6100e5366004610934565b610247565b60405190151581526020016100ce565b6002545b6040519081526020016100ce565b6100ea61011a36600461095e565b610261565b610127610285565b005b604051601281526020016100ce565b6100ea610146366004610934565b6103e4565b6100fe61015936600461099a565b6001600160a01b031660009081526020819052604090205490565b6100c1610406565b6100ea61018a366004610934565b610415565b6100ea61019d366004610934565b610490565b6100fe6101b03660046109bc565b61049e565b6060600380546101c4906109ef565b80601f01602080910402602001604051908101604052809291908181526020018280546101f0906109ef565b801561023d5780601f106102125761010080835404028352916020019161023d565b820191906000526020600020905b81548152906001019060200180831161022057829003601f168201915b5050505050905090565b6000336102558185856104c9565b60019150505b92915050565b60003361026f8582856105ed565b61027a858585610667565b506001949350505050565b6102a8336102956012600a610b23565b6102a390633b9aca00610b32565b61080b565b60015b6103e88110156103e1576102bf333361049e565b156103115760405162461bcd60e51b815260206004820152601b60248201527f6e6f6e2d7a65726f20616c6c6f77616e636520746f207374617274000000000060448201526064015b60405180910390fd5b61031b3382610247565b5080610327333361049e565b1461036c5760405162461bcd60e51b81526020600482015260156024820152746469646e2774206769766520616c6c6f77616e636560581b6044820152606401610308565b610377333383610261565b50610382333361049e565b156103cf5760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f20616c6c6f77616e636520746f20656e64000000000000006044820152606401610308565b806103d981610b49565b9150506102ab565b50565b6000336102558185856103f7838361049e565b6104019190610b62565b6104c9565b6060600480546101c4906109ef565b60003381610423828661049e565b9050838110156104835760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610308565b61027a82868684036104c9565b600033610255818585610667565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b03831661052b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610308565b6001600160a01b03821661058c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610308565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006105f9848461049e565b9050600019811461066157818110156106545760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610308565b61066184848484036104c9565b50505050565b6001600160a01b0383166106cb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610308565b6001600160a01b03821661072d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610308565b6001600160a01b038316600090815260208190526040902054818110156107a55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610308565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610661565b6001600160a01b0382166108615760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610308565b80600260008282546108739190610b62565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b818110156108f7578581018301518582016040015282016108db565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461092f57600080fd5b919050565b6000806040838503121561094757600080fd5b61095083610918565b946020939093013593505050565b60008060006060848603121561097357600080fd5b61097c84610918565b925061098a60208501610918565b9150604084013590509250925092565b6000602082840312156109ac57600080fd5b6109b582610918565b9392505050565b600080604083850312156109cf57600080fd5b6109d883610918565b91506109e660208401610918565b90509250929050565b600181811c90821680610a0357607f821691505b602082108103610a2357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115610a7a578160001904821115610a6057610a60610a29565b80851615610a6d57918102915b93841c9390800290610a44565b509250929050565b600082610a915750600161025b565b81610a9e5750600061025b565b8160018114610ab45760028114610abe57610ada565b600191505061025b565b60ff841115610acf57610acf610a29565b50506001821b61025b565b5060208310610133831016604e8410600b8410161715610afd575081810a61025b565b610b078383610a3f565b8060001904821115610b1b57610b1b610a29565b029392505050565b60006109b560ff841683610a82565b808202811582820484141761025b5761025b610a29565b600060018201610b5b57610b5b610a29565b5060010190565b8082018082111561025b5761025b610a2956fea2646970667358221220c33117c9d08b3ca92e5865f957cca670ed19c2990ba76736dd40b693ae62098064736f6c63430008110033 \ No newline at end of file diff --git a/core/vm/runtime/testdata/erc20mint.hex b/core/vm/runtime/testdata/erc20mint.hex deleted file mode 100644 index ed06ae6b14..0000000000 --- a/core/vm/runtime/testdata/erc20mint.hex +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b50600436106100b45760003560e01c80633950935111610071578063395093511461013857806370a082311461014b57806395d89b4114610174578063a457c2d71461017c578063a9059cbb1461018f578063dd62ed3e146101a257600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100fa57806323b872dd1461010c57806330627b7c1461011f578063313ce56714610129575b600080fd5b6100c16101b5565b6040516100ce919061079c565b60405180910390f35b6100ea6100e5366004610806565b610247565b60405190151581526020016100ce565b6002545b6040519081526020016100ce565b6100ea61011a366004610830565b610261565b610127610285565b005b604051601281526020016100ce565b6100ea610146366004610806565b6102b1565b6100fe61015936600461086c565b6001600160a01b031660009081526020819052604090205490565b6100c16102d3565b6100ea61018a366004610806565b6102e2565b6100ea61019d366004610806565b610362565b6100fe6101b036600461088e565b610370565b6060600380546101c4906108c1565b80601f01602080910402602001604051908101604052809291908181526020018280546101f0906108c1565b801561023d5780601f106102125761010080835404028352916020019161023d565b820191906000526020600020905b81548152906001019060200180831161022057829003601f168201915b5050505050905090565b60003361025581858561039b565b60019150505b92915050565b60003361026f8582856104bf565b61027a858585610539565b506001949350505050565b60005b6113888110156102ae5761029c33826106dd565b806102a681610911565b915050610288565b50565b6000336102558185856102c48383610370565b6102ce919061092a565b61039b565b6060600480546101c4906108c1565b600033816102f08286610370565b9050838110156103555760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61027a828686840361039b565b600033610255818585610539565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161034c565b6001600160a01b03821661045e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161034c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006104cb8484610370565b9050600019811461053357818110156105265760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161034c565b610533848484840361039b565b50505050565b6001600160a01b03831661059d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161034c565b6001600160a01b0382166105ff5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161034c565b6001600160a01b038316600090815260208190526040902054818110156106775760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161034c565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610533565b6001600160a01b0382166107335760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161034c565b8060026000828254610745919061092a565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b818110156107c9578581018301518582016040015282016107ad565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461080157600080fd5b919050565b6000806040838503121561081957600080fd5b610822836107ea565b946020939093013593505050565b60008060006060848603121561084557600080fd5b61084e846107ea565b925061085c602085016107ea565b9150604084013590509250925092565b60006020828403121561087e57600080fd5b610887826107ea565b9392505050565b600080604083850312156108a157600080fd5b6108aa836107ea565b91506108b8602084016107ea565b90509250929050565b600181811c908216806108d557607f821691505b6020821081036108f557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060018201610923576109236108fb565b5060010190565b8082018082111561025b5761025b6108fb56fea2646970667358221220fa5dc8b94ca8266a9f37b573a3ac8993380ce8da74caa7732abd6e7ed31cd37e64736f6c63430008110033 \ No newline at end of file diff --git a/core/vm/runtime/testdata/erc20transfer.hex b/core/vm/runtime/testdata/erc20transfer.hex deleted file mode 100644 index cc01470901..0000000000 --- a/core/vm/runtime/testdata/erc20transfer.hex +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b50600436106100b45760003560e01c80633950935111610071578063395093511461013857806370a082311461014b57806395d89b4114610174578063a457c2d71461017c578063a9059cbb1461018f578063dd62ed3e146101a257600080fd5b806306fdde03146100b9578063095ea7b3146100d757806318160ddd146100fa57806323b872dd1461010c57806330627b7c1461011f578063313ce56714610129575b600080fd5b6100c16101b5565b6040516100ce91906107bf565b60405180910390f35b6100ea6100e5366004610829565b610247565b60405190151581526020016100ce565b6002545b6040519081526020016100ce565b6100ea61011a366004610853565b610261565b610127610285565b005b604051601281526020016100ce565b6100ea610146366004610829565b6102d4565b6100fe61015936600461088f565b6001600160a01b031660009081526020819052604090205490565b6100c16102f6565b6100ea61018a366004610829565b610305565b6100ea61019d366004610829565b610385565b6100fe6101b03660046108b1565b610393565b6060600380546101c4906108e4565b80601f01602080910402602001604051908101604052809291908181526020018280546101f0906108e4565b801561023d5780601f106102125761010080835404028352916020019161023d565b820191906000526020600020905b81548152906001019060200180831161022057829003601f168201915b5050505050905090565b6000336102558185856103be565b60019150505b92915050565b60003361026f8582856104e2565b61027a85858561055c565b506001949350505050565b6102a6336102956012600a610a18565b6102a190612710610a27565b610700565b60005b6113888110156102d1576102be600182610385565b50806102c981610a3e565b9150506102a9565b50565b6000336102558185856102e78383610393565b6102f19190610a57565b6103be565b6060600480546101c4906108e4565b600033816103138286610393565b9050838110156103785760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61027a82868684036103be565b60003361025581858561055c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104205760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161036f565b6001600160a01b0382166104815760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161036f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006104ee8484610393565b9050600019811461055657818110156105495760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161036f565b61055684848484036103be565b50505050565b6001600160a01b0383166105c05760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161036f565b6001600160a01b0382166106225760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161036f565b6001600160a01b0383166000908152602081905260409020548181101561069a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161036f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610556565b6001600160a01b0382166107565760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161036f565b80600260008282546107689190610a57565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600060208083528351808285015260005b818110156107ec578581018301518582016040015282016107d0565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461082457600080fd5b919050565b6000806040838503121561083c57600080fd5b6108458361080d565b946020939093013593505050565b60008060006060848603121561086857600080fd5b6108718461080d565b925061087f6020850161080d565b9150604084013590509250925092565b6000602082840312156108a157600080fd5b6108aa8261080d565b9392505050565b600080604083850312156108c457600080fd5b6108cd8361080d565b91506108db6020840161080d565b90509250929050565b600181811c908216806108f857607f821691505b60208210810361091857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561096f5781600019048211156109555761095561091e565b8085161561096257918102915b93841c9390800290610939565b509250929050565b6000826109865750600161025b565b816109935750600061025b565b81600181146109a957600281146109b3576109cf565b600191505061025b565b60ff8411156109c4576109c461091e565b50506001821b61025b565b5060208310610133831016604e8410600b84101617156109f2575081810a61025b565b6109fc8383610934565b8060001904821115610a1057610a1061091e565b029392505050565b60006108aa60ff841683610977565b808202811582820484141761025b5761025b61091e565b600060018201610a5057610a5061091e565b5060010190565b8082018082111561025b5761025b61091e56fea26469706673582212200111a8455f1c6aba553f7e7a1fe413d6a44eececa7e001df4c190aef76f39b5864736f6c63430008110033 \ No newline at end of file diff --git a/core/vm/runtime/testdata/evm-bench/README.md b/core/vm/runtime/testdata/evm-bench/README.md deleted file mode 100644 index 128d1faccf..0000000000 --- a/core/vm/runtime/testdata/evm-bench/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# evm-bench whole-contract interpreter benchmarks - -Realistic-workload benchmarks for the `core/vm` interpreter, driven by contracts -from the [evm-bench](https://github.com/ziyadedher/evm-bench) suite. They -complement the opcode/loop micro-benchmarks in `runtime_test.go`. - -- Benchmark code: [`core/vm/runtime/evm_bench_test.go`](../../evm_bench_test.go) -- Runtime bytecode: `core/vm/runtime/testdata/*.hex` (committed, `//go:embed`-ed) - -Each contract exposes a `Benchmark()` entrypoint (selector `0x30627b7c`) that -performs the entire workload internally, so one `runtime.Call` = one full -workload: - -| benchmark | workload | -|---|---| -| `Snailtracer` | a ray tracer, compute and memory heavy | -| `ERC20Transfer` | ERC-20 transfers in a loop | -| `ERC20Mint` | 5000 `_mint`s (SSTORE/keccak/LOG-heavy) | -| `ERC20ApprovalTransfer` | 1000 approve+transferFrom cycles | -| `TenThousandHashes` | 20000 chained keccak256 calls | - -## Running - -```sh -# all of them, current build -go test ./core/vm/runtime/ -run '^$' -bench 'Benchmark(Snailtracer|TenThousandHashes|ERC20)' -benchmem -count=10 - -# A/B vs a baseline (default master), with benchstat -core/vm/runtime/testdata/evm-bench/compare.sh # vs master -core/vm/runtime/testdata/evm-bench/compare.sh HEAD~1 8 # vs another ref, count=8 -``` - -`compare.sh` benches the current working tree and a baseline ref (checked out in -a throwaway worktree with this suite copied in, so it works whether or not the -interpreter change is committed) and runs `benchstat`. Besides the contract -workloads it runs both `BenchmarkInsertChain_evmWorkload` variants from -`core/bench_test.go`, which push blocks carrying these contracts through the -full block import path (state in memory and on disk) and report Mgas/s, as a -local stand-in for sync throughput. The synthetic dispatch loops (`BenchmarkSimpleLoop/loop*` in -`core/vm/runtime/runtime_test.go`) are not part of the A/B suite, but can -still be run manually to isolate dispatch overhead. - -## Regenerating the bytecode - -[`gen.sh`](gen.sh) regenerates the ERC-20 and ten-thousand-hashes `.hex` from -the evm-bench Solidity sources (solc 0.8.17 via docker). These contracts set up -their state inside `Benchmark()`, so the runtime bytecode is callable directly. - -`TenThousandHashes` is compiled from the vendored -[`TenThousandHashes.sol`](TenThousandHashes.sol) in this directory, not the -upstream evm-bench file. Upstream discards the hash result, so solc's optimizer -deletes the keccak256 and the compiled benchmark degenerates into a bare -counter loop performing a single static hash. The vendored copy chains the hash -through a returned accumulator so the optimized bytecode performs all 20000 -hashes. Numbers for this benchmark are therefore not comparable with evm-bench -or gevm published tables, which use degenerate bytecode (gevm's local -replacement is broken differently, an inverted loop bound that hashes once). - -`snailtracer.hex` is **vendored, not regenerated by gen.sh**: evm-bench's -`SnailTracer` initializes its scene in the constructor, so its runtime bytecode -(no constructor) renders an empty scene. The committed file is a runtime-callable -build (scene encoded in code) vendored from -[Giulio2002/gevm](https://github.com/Giulio2002/gevm)'s gethbench testdata. - -The `.hex` files are committed, so running the benchmarks needs no toolchain. - -## Notes - -- The contract constructor is not executed, so storage starts empty. The - evm-bench contracts set up whatever state they need inside `Benchmark()`, - matching the work the evm-bench harness measures. -- Names match evm-bench / gevm for cross-comparison, except `TenThousandHashes` - (see the regenerating section). diff --git a/core/vm/runtime/testdata/evm-bench/TenThousandHashes.sol b/core/vm/runtime/testdata/evm-bench/TenThousandHashes.sol deleted file mode 100644 index 004215e96f..0000000000 --- a/core/vm/runtime/testdata/evm-bench/TenThousandHashes.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.17; - -// Vendored from evm-bench (github.com/ziyadedher/evm-bench) with one fix. -// The upstream loop discards the keccak256 result, so solc's optimizer -// removes the pure call entirely and the compiled benchmark degenerates -// into a bare counter loop that performs a single static hash. Chaining -// the hash through an accumulator that the function returns keeps all -// 20000 hashes in the optimized bytecode. The Benchmark() selector is -// unchanged because return types are not part of the signature. -contract TenThousandHashes { - function Benchmark() external pure returns (bytes32 acc) { - for (uint256 i = 0; i < 20000; i++) { - acc = keccak256(abi.encodePacked(acc, i)); - } - } -} diff --git a/core/vm/runtime/testdata/evm-bench/compare.sh b/core/vm/runtime/testdata/evm-bench/compare.sh deleted file mode 100755 index aaf4eb9282..0000000000 --- a/core/vm/runtime/testdata/evm-bench/compare.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash -# A/B benchmark of the codegen interpreter vs a baseline: runs the evm-bench -# contract workloads (core/vm/runtime/evm_bench_test.go) plus the block import -# benchmark (core/bench_test.go, BenchmarkInsertChain_evmWorkload, a local -# stand-in for sync throughput) on the current working tree and on a baseline -# ref, then benchstats them. -# -# The baseline is checked out in a throwaway git worktree and this suite is -# copied into it, so the comparison works whether or not the interpreter changes -# are committed yet. Requires: go, git, and benchstat -# (go install golang.org/x/perf/cmd/benchstat@latest). -# -# Usage: core/vm/runtime/testdata/evm-bench/compare.sh [baseref] [count] -# baseref defaults to "master", count to 10. -set -euo pipefail - -ROOT="$(cd "$(dirname "$0")/../../../../.." && pwd)" # repo root -cd "$ROOT" -BASEREF="${1:-master}" -COUNT="${2:-10}" -# Each benchmark runs a FIXED iteration count instead of the default 1s of -# benchtime. With time-based benchtime the faster side runs more iterations, -# so one-time costs (map growth, pool warmup) amortize over a different N and -# B/op picks up phantom deltas, and GC pacing can do the same to sec/op. Fixed -# N makes both sides do identical work. The counts target roughly one second -# per count on a fast box. Each entry is package:pattern:iterations. -BENCHES=( - './core/vm/runtime/:^BenchmarkSnailtracer$:20x' - './core/vm/runtime/:^BenchmarkTenThousandHashes$:100x' - './core/vm/runtime/:^BenchmarkERC20Transfer$:100x' - './core/vm/runtime/:^BenchmarkERC20Mint$:150x' - './core/vm/runtime/:^BenchmarkERC20ApprovalTransfer$:120x' - './core/:^BenchmarkInsertChain_evmWorkload_memdb$:10x' - './core/:^BenchmarkInsertChain_evmWorkload_diskdb$:10x' -) -NEW="$(mktemp)"; OLD="$(mktemp)" - -run_suite() { # run_suite - local dir="$1" out="$2" entry pkg pat n - for entry in "${BENCHES[@]}"; do - pkg="${entry%%:*}" - pat="${entry#*:}"; pat="${pat%:*}" - n="${entry##*:}" - ( cd "$dir" && go test "$pkg" -run '^$' -bench "$pat" -benchmem -benchtime "$n" -count="$COUNT" ) | tee -a "$out" - done -} - -echo "==> current working tree" -run_suite "$ROOT" "$NEW" - -echo "==> baseline: $BASEREF (throwaway worktree, suite copied in)" -WT="$(mktemp -d)" -git worktree add --quiet --detach "$WT" "$BASEREF" -cp core/vm/runtime/evm_bench_test.go "$WT/core/vm/runtime/" -cp core/bench_test.go "$WT/core/bench_test.go" -mkdir -p "$WT/core/vm/runtime/testdata" -cp core/vm/runtime/testdata/*.hex "$WT/core/vm/runtime/testdata/" -run_suite "$WT" "$OLD" -git worktree remove --force "$WT" - -echo "==> benchstat: $BASEREF (left) vs working tree (right)" -benchstat "$OLD" "$NEW" diff --git a/core/vm/runtime/testdata/evm-bench/gen.sh b/core/vm/runtime/testdata/evm-bench/gen.sh deleted file mode 100755 index 26dbb6b73d..0000000000 --- a/core/vm/runtime/testdata/evm-bench/gen.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash -# Regenerates core/vm/runtime/testdata/*.hex, the runtime bytecode for the -# whole-contract interpreter benchmarks (see core/vm/runtime/evm_bench_test.go). -# -# Source: the evm-bench suite (github.com/ziyadedher/evm-bench). Each contract -# exposes Benchmark() (selector 0x30627b7c) which performs the whole workload. -# Compiled with solc via docker (no local solc needed). solc versions match each -# contract's pragma: 0.8.17 for the ERC-20/hashing contracts, 0.4.26 for the -# legacy SnailTracer. -# -# TenThousandHashes is compiled from the vendored TenThousandHashes.sol in -# this directory rather than the upstream file. Upstream discards the hash -# result, so the optimizer deletes the keccak256 and the benchmark degenerates -# into a bare counter loop. The vendored copy chains the hash through a -# returned accumulator, which keeps all 20000 hashes in the bytecode. See the -# comment in that file. -# -# Usage: core/vm/runtime/testdata/evm-bench/gen.sh -set -euo pipefail - -TD="$(cd "$(dirname "$0")/.." && pwd)" # .../core/vm/runtime/testdata -HERE="$(cd "$(dirname "$0")" && pwd)" # .../testdata/evm-bench -WORK="$(mktemp -d)" -trap 'rm -rf "$WORK"' EXIT - -git clone --depth 1 https://github.com/ziyadedher/evm-bench "$WORK/evm-bench" >/dev/null 2>&1 -B="$WORK/evm-bench/benchmarks" -cp "$HERE/TenThousandHashes.sol" "$B/ten-thousand-hashes/TenThousandHashes.sol" - -# ERC-20 (transfer/mint/approval) + ten-thousand-hashes: pragma ^0.8.17. These -# set up all their state inside Benchmark(), so the runtime bytecode is callable -# directly with no constructor, which is how the benchmark drives them. -docker run --rm -v "$B":/src -w /src ethereum/solc:0.8.17 \ - --optimize --bin-runtime --overwrite -o /src/out \ - erc20/transfer/ERC20Transfer.sol \ - erc20/mint/ERC20Mint.sol \ - erc20/approval-transfer/ERC20ApprovalTransfer.sol \ - ten-thousand-hashes/TenThousandHashes.sol - -cp "$B/out/TenThousandHashes.bin-runtime" "$TD/tenthousandhashes.hex" -cp "$B/out/ERC20Transfer.bin-runtime" "$TD/erc20transfer.hex" -cp "$B/out/ERC20Mint.bin-runtime" "$TD/erc20mint.hex" -cp "$B/out/ERC20ApprovalTransfer.bin-runtime" "$TD/erc20approval.hex" - -# NOTE: snailtracer.hex is not regenerated here. evm-bench's SnailTracer -# initializes its scene in the constructor, so its --bin-runtime (no constructor) -# renders an empty scene. The committed snailtracer.hex is a runtime-callable -# build (scene encoded in code, Benchmark() self-contained) vendored from -# Giulio2002/gevm's gethbench testdata. Leave it as-is. - -echo "regenerated (snailtracer.hex left vendored):" -ls -l "$TD"/*.hex diff --git a/core/vm/runtime/testdata/snailtracer.hex b/core/vm/runtime/testdata/snailtracer.hex deleted file mode 100644 index 9546187294..0000000000 --- a/core/vm/runtime/testdata/snailtracer.hex +++ /dev/null @@ -1 +0,0 @@ -608060405234801561001057600080fd5b506004361061004c5760003560e01c806330627b7c1461005157806375ac892a14610085578063784f13661461011d578063c294360114610146575b600080fd5b610059610163565b604080516001600160f81b03199485168152928416602084015292168183015290519081900360600190f35b6100a86004803603604081101561009b57600080fd5b50803590602001356102d1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100e25781810151838201526020016100ca565b50505050905090810190601f16801561010f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100596004803603606081101561013357600080fd5b508035906020810135906040013561055b565b6100a86004803603602081101561015c57600080fd5b5035610590565b6000806000610176610400610300610834565b60405180606001604052806001546000546207d5dc028161019357fe5b058152600060208083018290526040928301919091528251600b81905583820151600c81905593830151600d819055835160608082018652928152808401959095528484015282519081018352600654815260075491810191909152600854918101919091526102259161021c916102139161020e91612ef7565b612f64565b6207d5dc612feb565b620f424061301e565b8051600e556020810151600f55604001516010556102416142dd565b61025a816102556102006101806008613064565b613212565b90506102708161025561014561021c6008613064565b905061028481610255610258806008613064565b905061029a8161025561020a61020c6008613064565b90506102a781600461301e565b90506102b1613250565b8051602082015160409092015160f891821b9692821b9550901b92509050565b606060005b6000548112156104c95760006102ed828686613064565b90506002816000015160f81b90808054603f811680603e811461032a576002830184556001831661031c578192505b600160028404019350610342565b600084815260209081902060ff198516905560419094555b505050600190038154600116156103685790600052602060002090602091828204019190065b909190919091601f036101000a81548160ff02191690600160f81b840402179055506002816020015160f81b90808054603f811680603e81146103c557600283018455600183166103b7578192505b6001600284040193506103dd565b600084815260209081902060ff198516905560419094555b505050600190038154600116156104035790600052602060002090602091828204019190065b909190919091601f036101000a81548160ff02191690600160f81b840402179055506002816040015160f81b90808054603f811680603e81146104605760028301845560018316610452578192505b600160028404019350610478565b600084815260209081902060ff198516905560419094555b5050506001900381546001161561049e5790600052602060002090602091828204019190065b815460ff601f929092036101000a9182021916600160f81b90930402919091179055506001016102d6565b506002805460408051602060018416156101000260001901909316849004601f8101849004840282018401909252818152929183018282801561054d5780601f106105225761010080835404028352916020019161054d565b820191906000526020600020905b81548152906001019060200180831161053057829003601f168201915b505050505090505b92915050565b60008060008061056c878787613064565b8051602082015160409092015160f891821b9a92821b9950901b9650945050505050565b600154606090600019015b600081126107a35760005b6000548112156107995760006105bd828487613064565b90506002816000015160f81b90808054603f811680603e81146105fa57600283018455600183166105ec578192505b600160028404019350610612565b600084815260209081902060ff198516905560419094555b505050600190038154600116156106385790600052602060002090602091828204019190065b909190919091601f036101000a81548160ff02191690600160f81b840402179055506002816020015160f81b90808054603f811680603e81146106955760028301845560018316610687578192505b6001600284040193506106ad565b600084815260209081902060ff198516905560419094555b505050600190038154600116156106d35790600052602060002090602091828204019190065b909190919091601f036101000a81548160ff02191690600160f81b840402179055506002816040015160f81b90808054603f811680603e81146107305760028301845560018316610722578192505b600160028404019350610748565b600084815260209081902060ff198516905560419094555b5050506001900381546001161561076e5790600052602060002090602091828204019190065b815460ff601f929092036101000a9182021916600160f81b90930402919091179055506001016105a6565b506000190161059b565b506002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156108275780601f106107fc57610100808354040283529160200191610827565b820191906000526020600020905b81548152906001019060200180831161080a57829003601f168201915b505050505090505b919050565b8160008190555080600181905550604051806080016040528060405180606001604052806302faf08081526020016303197500815260200163119e7f8081525081526020016108a460405180606001604052806000815260200161a673198152602001620f423f19815250612f64565b815260006020808301829052604092830182905283518051600355808201516004558301516005558381015180516006559081015160075582015160085582820151600955606092830151600a805460ff1916911515919091179055815192830190915260015490548291906207d5dc028161091c57fe5b058152600060208083018290526040928301919091528251600b81905583820151600c81905593830151600d819055835160608082018652928152808401959095528484015282519081018352600654815260075491810191909152600854918101919091526109979161021c916102139161020e91612ef7565b8051600e55602080820151600f55604091820151601055815160a08101835264174876e8008152825160608082018552641748862a40825263026e8f00828501526304dd1e008286015282840191825284518082018652600080825281860181905281870181905284870191825286518084018852620b71b081526203d09081880181905281890152928501928352608085018181526011805460018082018355919093528651600b9093027f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c688101938455955180517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c69880155808901517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a8801558901517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b870155925180517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c870155808801517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d8701558801517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e860155925180517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6f860155958601517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c7085015594909501517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c71830155517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c72909101805492949192909160ff1990911690836002811115610c1057fe5b0217905550505060116040518060a0016040528064174876e8008152602001604051806060016040528064174290493f19815260200163026e8f0081526020016304dd1e008152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806203d09081526020016203d0908152602001620b71b0815250815260200160006002811115610cb657fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff1990921691908490811115610d5857fe5b0217905550505060116040518060a0016040528064174876e800815260200160405180606001604052806302faf080815260200163026e8f00815260200164174876e800815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620b71b08152602001620b71b08152602001620b71b0815250815260200160006002811115610dfd57fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff1990921691908490811115610e9f57fe5b0217905550505060116040518060a0016040528064174876e800815260200160405180606001604052806302faf080815260200163026e8f00815260200164173e54e97f1981525081526020016040518060600160405280600081526020016000815260200160008152508152602001604051806060016040528060008152602001600081526020016000815250815260200160006002811115610f3f57fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff1990921691908490811115610fe157fe5b0217905550505060116040518060a0016040528064174876e800815260200160405180606001604052806302faf080815260200164174876e80081526020016304dd1e00815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620b71b08152602001620b71b08152602001620b71b081525081526020016000600281111561108657fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff199092169190849081111561112857fe5b0217905550505060116040518060a0016040528064174876e800815260200160405180606001604052806302faf080815260200164174399c9ff1981526020016304dd1e00815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620b71b08152602001620b71b08152602001620b71b08152508152602001600060028111156111ce57fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff199092169190849081111561127057fe5b0217905550505060116040518060a0016040528062fbc5208152602001604051806060016040528063019bfcc0815260200162fbc52081526020016302cd29c0815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561131157fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff19909216919084908111156113b357fe5b0217905550505060116040518060a001604052806323c34600815260200160405180606001604052806302faf080815260200163289c455081526020016304dd1e008152508152602001604051806060016040528062b71b00815260200162b71b00815260200162b71b00815250815260200160405180606001604052806000815260200160008152602001600081525081526020016000600281111561145657fe5b905281546001818101845560009384526020938490208351600b90930201918255838301518051838301558085015160028085019190915560409182015160038501558185015180516004860155808701516005860155820151600685015560608501518051600786015595860151600885015594015160098301556080830151600a83018054949593949193909260ff19909216919084908111156114f857fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f208152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001630188c2e081526020016305a1f4a081525081526020016040518060600160405280630459e44081526020016302f34f6081526020016304a62f808152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561160c57fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff19909216919084908111156116fd57fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f20815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001600081526020016304a62f8081525081526020016040518060600160405280630459e440815260200163016a8c8081526020016305a1f4a08152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561180e57fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff19909216919084908111156118ff57fe5b0217905550505060126040518060e001604052806040518060600160405280630555a9608152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630459e44081526020016302f34f6081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001630188c2e081526020016305a1f4a08152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e58815250815260200160016002811115611a1357fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff1990921691908490811115611b0457fe5b0217905550505060126040518060e001604052806040518060600160405280630555a960815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630459e440815260200163016a8c8081526020016305a1f4a081525081526020016040518060600160405280630459e4408152602001600081526020016304a62f808152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e58815250815260200160016002811115611c1557fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff1990921691908490811115611d0657fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f208152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630459e44081526020016302f34f6081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001630188c2e081526020016303aa6a608152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e58815250815260200160016002811115611e1a57fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff1990921691908490811115611f0b57fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f20815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630459e440815260200163016a8c8081526020016303aa6a6081525081526020016040518060600160405280630459e4408152602001600081526020016304a62f808152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561201c57fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff199092169190849081111561210d57fe5b0217905550505060126040518060e001604052806040518060600160405280630555a9608152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001630188c2e081526020016303aa6a6081525081526020016040518060600160405280630459e44081526020016302f34f6081526020016304a62f808152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561222157fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff199092169190849081111561231257fe5b0217905550505060126040518060e001604052806040518060600160405280630555a960815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001600081526020016304a62f8081525081526020016040518060600160405280630459e440815260200163016a8c8081526020016303aa6a608152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561242357fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff199092169190849081111561251457fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f208152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001630188c2e081526020016303aa6a6081525081526020016040518060600160405280630555a9608152602001630188c2e081526020016304a62f808152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561262857fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff199092169190849081111561271957fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f208152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630555a9608152602001630188c2e081526020016304a62f8081525081526020016040518060600160405280630459e4408152602001630188c2e081526020016305a1f4a08152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e5881525081526020016001600281111561282d57fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff199092169190849081111561291e57fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f20815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630555a960815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630459e440815260200163016a8c8081526020016303aa6a608152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e58815250815260200160016002811115612a3257fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff1990921691908490811115612b2357fe5b0217905550505060126040518060e00160405280604051806060016040528063035e1f20815260200163016a8c8081526020016304a62f8081525081526020016040518060600160405280630459e440815260200163016a8c8081526020016305a1f4a081525081526020016040518060600160405280630555a960815260200163016a8c8081526020016304a62f808152508152602001604051806060016040528060008152602001600081526020016000815250815260200160405180606001604052806000815260200160008152602001600081525081526020016040518060600160405280620f3e588152602001620f3e588152602001620f3e58815250815260200160016002811115612c3757fe5b905281546001818101845560009384526020938490208351805160139094029091019283558085015183830155604090810151600280850191909155858501518051600386015580870151600486015582015160058501558185015180516006860155808701516007860155820151600885015560608501518051600986015580870151600a860155820151600b85015560808501518051600c86015580870151600d860155820151600e85015560a08501518051600f860155958601516010850155940151601183015560c0830151601283018054949593949193909260ff1990921691908490811115612d2857fe5b0217905550505060005b601254811015612ef257600060128281548110612d4b57fe5b600091825260209182902060408051610140810182526013909302909101805460e08401908152600182015461010085015260028083015461012086015290845282516060818101855260038401548252600484015482880152600584015482860152858701919091528351808201855260068401548152600784015481880152600884015481860152858501528351808201855260098401548152600a84015481880152600b840154818601528186015283518082018552600c8401548152600d84015481880152600e84015481860152608086015283519081018452600f830154815260108301549581019590955260118201549285019290925260a0830193909352601283015491929160c084019160ff90911690811115612e6c57fe5b6002811115612e7757fe5b815250509050612eac61020e612e95836020015184600001516132cd565b612ea7846040015185600001516132cd565b612ef7565b60128381548110612eb957fe5b60009182526020918290208351600960139093029091019182015590820151600a820155604090910151600b9091015550600101612d32565b505050565b612eff6142dd565b604051806060016040528083602001518560400151028460400151866020015102038152602001836040015185600001510284600001518660400151020381526020018360000151856020015102846020015186600001510203815250905092915050565b612f6c6142dd565b604082015160208301518351600092612f9292918002918002919091019080020161330c565b90506040518060600160405280828560000151620f42400281612fb157fe5b058152602001828560200151620f42400281612fc957fe5b058152602001828560400151620f42400281612fe157fe5b0590529392505050565b612ff36142dd565b5060408051606081018252835183028152602080850151840290820152928101519091029082015290565b6130266142dd565b60405180606001604052808385600001518161303e57fe5b0581526020018385602001518161305157fe5b05815260200183856040015181612fe157fe5b61306c6142dd565b6000546013805463ffffffff1916918502860163ffffffff169190911790556130936142dd565b905060005b828112156131f157600061317261314c61021c613115600b60405180606001604052908160008201548152602001600182015481526020016002820154815250506207a1206000546207a1206130ec613343565b63ffffffff16816130f957fe5b0663ffffffff168d620f424002018161310e57fe5b0503612feb565b60408051606081018252600e548152600f5460208201526010549181019190915260015461025591906207a12090816130ec613343565b604080516060810182526006548152600754602082015260085491810191909152613212565b6040805160e081019091526003546080820190815260045460a083015260055460c083015291925060009181906131ae9061025586608c612feb565b81526020016131bc84612f64565b815260006020820181905260409091015290506131e5846102556131df8461336c565b8861301e565b93505050600101613098565b5061320861021c61320183613753565b60ff612feb565b90505b9392505050565b61321a6142dd565b50604080516060810182528251845101815260208084015181860151019082015291810151928101519092019181019190915290565b60008080556001819055613266906002906142fe565b60006003819055600481905560058190556006819055600781905560088190556009819055600a805460ff19169055600b819055600c819055600d819055600e819055600f81905560108190556132bf90601190614345565b6132cb60126000614366565b565b6132d56142dd565b5060408051606081018252825184510381526020808401518186015103908201528282015184830151039181019190915292915050565b80600260018201055b8181121561333d5780915060028182858161332c57fe5b05018161333557fe5b059050613315565b50919050565b6013805463ffffffff19811663ffffffff9182166341c64e6d0261303901821617918290551690565b6133746142dd565b600a826040015113156133a657604051806060016040528060008152602001600081526020016000815250905061082f565b60008060006133b48561379f565b91945092509050826133e857604051806060016040528060008152602001600081526020016000815250935050505061082f565b6133f0614387565b6133f86143c7565b6134006142dd565b6134086142dd565b600086600181111561341657fe5b1415613505576011858154811061342957fe5b60009182526020918290206040805160a081018252600b90930290910180548352815160608082018452600183015482526002808401548388015260038401548386015285870192909252835180820185526004840154815260058401548188015260068401548186015285850152835180820185526007840154815260088401549681019690965260098301549386019390935291830193909352600a830154919291608084019160ff909116908111156134e157fe5b60028111156134ec57fe5b8152505093508360600151915083604001519050613653565b6012858154811061351257fe5b600091825260209182902060408051610140810182526013909302909101805460e08401908152600182015461010085015260028083015461012086015290845282516060818101855260038401548252600484015482880152600584015482860152858701919091528351808201855260068401548152600784015481880152600884015481860152858501528351808201855260098401548152600a84015481880152600b840154818601528186015283518082018552600c8401548152600d84015481880152600e84015481860152608086015283519081018452600f830154815260108301549581019590955260118201549285019290925260a0830193909352601283015491929160c084019160ff9091169081111561363357fe5b600281111561363e57fe5b8152505092508260a001519150826080015190505b6040820151600190811215613669575060408201515b808360200151131561367c575060208201515b808360400151131561368f575060408201515b60408a01805160010190819052600512156136f75780620f42406136b1613343565b63ffffffff16816136be57fe5b0663ffffffff1612156136e8576136e16136db84620f4240612feb565b8261301e565b92506136f7565b50965061082f95505050505050565b6136ff6142dd565b600088600181111561370d57fe5b14156137255761371e8b878b613a57565b9050613733565b6137308b868b613aec565b90505b6137448361025561021c8785613baa565b9b9a5050505050505050505050565b61375b6142dd565b60405180606001604052806137738460000151613be8565b81526020016137858460200151613be8565b81526020016137978460400151613be8565b905292915050565b60008080808080805b6011548110156138c2576000613890601183815481106137c457fe5b60009182526020918290206040805160a081018252600b90930290910180548352815160608082018452600183015482526002808401548388015260038401548386015285870192909252835180820185526004840154815260058401548188015260068401548186015285850152835180820185526007840154815260088401549681019690965260098301549386019390935291830193909352600a830154919291608084019160ff9091169081111561387c57fe5b600281111561388757fe5b9052508a613c13565b90506000811380156138a957508415806138a957508481125b156138b957809450600093508192505b506001016137a8565b5060005b601254811015613a49576000613a17601283815481106138e257fe5b600091825260209182902060408051610140810182526013909302909101805460e08401908152600182015461010085015260028083015461012086015290845282516060818101855260038401548252600484015482880152600584015482860152858701919091528351808201855260068401548152600784015481880152600884015481860152858501528351808201855260098401548152600a84015481880152600b840154818601528186015283518082018552600c8401548152600d84015481880152600e84015481860152608086015283519081018452600f830154815260108301549581019590955260118201549285019290925260a0830193909352601283015491929160c084019160ff90911690811115613a0357fe5b6002811115613a0e57fe5b9052508a613cbb565b9050600081138015613a305750841580613a3057508481125b15613a4057809450600193508192505b506001016138c6565b509196909550909350915050565b613a5f6142dd565b6000613a7a856000015161025561021c886020015187612feb565b90506000613a8f61020e8387602001516132cd565b9050600085608001516002811115613aa357fe5b1415613ae1576000613ab9828860200151613e0c565b12613acd57613aca81600019612feb565b90505b613ad8868383613e31565b9250505061320b565b613ad8868383613fc1565b613af46142dd565b6000613b0f856000015161025561021c886020015187612feb565b6060860151909150620a2c2a9015613b2757506216e3605b6000620f4240613b3f87606001518960200151613e0c565b81613b4657fe5b05905060008112613b55576000035b64e8d4a5100081800281038380020281900590036000811215613b8c57613b8188858960600151613fc1565b94505050505061320b565b613b9e88858960600151868686614039565b98975050505050505050565b613bb26142dd565b50604080516060810182528251845102815260208084015181860151029082015291810151928101519092029181019190915290565b600080821215613bfa5750600061082f565b620f4240821315613c0f5750620f424061082f565b5090565b600080613c28846020015184600001516132cd565b90506000620f4240613c3e838660200151613e0c565b81613c4557fe5b865191900591506000908002613c5b8480613e0c565b838402030190506000811215613c775760009350505050610555565b613c808161330c565b90506103e88183031315613c9957900391506105559050565b6103e88183011315613caf570191506105559050565b50600095945050505050565b600080613cd0846020015185600001516132cd565b90506000613ce6856040015186600001516132cd565b90506000613cf8856020015183612ef7565b90506000620f4240613d0a8584613e0c565b81613d1157fe5b0590506103e71981138015613d2757506103e881125b15613d39576000945050505050610555565b85518751600091613d49916132cd565b9050600082613d588386613e0c565b81613d5f57fe5b0590506000811280613d735750620f424081135b15613d875760009650505050505050610555565b6000613d938388612ef7565b9050600084613da68b6020015184613e0c565b81613dad57fe5b0590506000811280613dc35750620f4240818401135b15613dd957600098505050505050505050610555565b600085613de68985613e0c565b81613ded57fe5b0590506103e88112156137445760009950505050505050505050610555565b6040808201519083015160208084015190850151845186510291020191020192915050565b613e396142dd565b6000620f424080613e48613343565b63ffffffff1681613e5557fe5b0663ffffffff16625fdfb00281613e6857fe5b0590506000620f4240613e79613343565b63ffffffff1681613e8657fe5b0663ffffffff1690506000613e9a8261330c565b6103e8029050613ea86142dd565b620186a0613eb98760000151614216565b1315613ee657604051806060016040528060008152602001620f4240815260200160008152509050613f09565b6040518060600160405280620f4240815260200160008152602001600081525090505b613f1661020e8288612ef7565b90506000613f2761020e8884612ef7565b9050613f7f61020e613f64613f5285620f424088613f448c61422e565b0281613f4c57fe5b05612feb565b61025585620f424089613f448d61424e565b6102558a613f7689620f42400361330c565b6103e802612feb565b9150613fb460405180608001604052808a81526020018481526020018b6040015181526020018b60600151151581525061336c565b9998505050505050505050565b613fc96142dd565b6000613ffb61020e8660200151613ff686620f4240613fec898c60200151613e0c565b60020281613f4c57fe5b6132cd565b90506140306040518060800160405280868152602001838152602001876040015181526020018760600151151581525061336c565b95945050505050565b6140416142dd565b60608701516000199015614053575060015b600061408961020e61021c61406c8c602001518a612feb565b613ff68b6140798a61330c565b620f42408c8e0205018802612feb565b60608a0151909150620f42408601906140ba57620f42406140aa838a613e0c565b816140b157fe5b05620f42400390505b60408a0151619c406c0c9f2c9cd04674edea40000000620ea6008480028502850285020205019060021261415e5761412a61411f60405180608001604052808d81526020018681526020018e6040015181526020018e6060015115151581525061336c565b82620f424003612feb565b92506141448361025561413e8e8e8e613fc1565b84612feb565b925061415383620f424061301e565b94505050505061420c565b600281056203d09001620f4240614173613343565b63ffffffff168161418057fe5b0663ffffffff1612156141b2576141536141a461419e8d8d8d613fc1565b83612feb565b600283056203d0900161301e565b6142056141f76141ec60405180608001604052808e81526020018781526020018f6040015181526020018f6060015115151581525061336c565b83620f424003612feb565b60028305620b71b00361301e565b9450505050505b9695505050505050565b60008082131561422757508061082f565b5060000390565b60008061423a8361424e565b905061320b81820264e8d4a510000361330c565b60005b600082121561426757625fdfb082019150614251565b5b625fdfb0821261427f57625fdfb082039150614268565b6001828160025b818313156142d457818385028161429957fe5b0585019450620f4240808788860202816142af57fe5b05816142b757fe5b600095909503940592506001810181029190910290600201614286565b50505050919050565b60405180606001604052806000815260200160008152602001600081525090565b50805460018160011615610100020316600290046000825580601f106143245750614342565b601f0160209004906000526020600020908101906143429190614401565b50565b50805460008255600b02906000526020600020908101906143429190614416565b50805460008255601302906000526020600020908101906143429190614475565b6040518060a00160405280600081526020016143a16142dd565b81526020016143ae6142dd565b81526020016143bb6142dd565b81526020016000905290565b6040518060e001604052806143da6142dd565b81526020016143e76142dd565b81526020016143f46142dd565b81526020016143a16142dd565b5b80821115613c0f5760008155600101614402565b5b80821115613c0f57600080825560018201819055600282018190556003820181905560048201819055600582018190556006820181905560078201819055600882018190556009820155600a8101805460ff19169055600b01614417565b5b80821115613c0f576000808255600182018190556002820181905560038201819055600482018190556005820181905560068201819055600782018190556008820181905560098201819055600a8201819055600b8201819055600c8201819055600d8201819055600e8201819055600f820181905560108201819055601182015560128101805460ff1916905560130161447656fea2646970667358221220037024f5647853879c58fbcc61ac3616455f6f731cc6e84f91eb5a3b4e06c00464736f6c63430007060033 \ No newline at end of file diff --git a/core/vm/runtime/testdata/tenthousandhashes.hex b/core/vm/runtime/testdata/tenthousandhashes.hex deleted file mode 100644 index f2903b13d9..0000000000 --- a/core/vm/runtime/testdata/tenthousandhashes.hex +++ /dev/null @@ -1 +0,0 @@ -6080604052348015600f57600080fd5b506004361060285760003560e01c806330627b7c14602d575b600080fd5b60336045565b60405190815260200160405180910390f35b6000805b614e20811015608e57604080516020810184905290810182905260600160405160208183030381529060405280519060200120915080806087906092565b9150506049565b5090565b60006001820160b157634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212207f65e4c71aef311b81ff8b065cdd78f5be33f5dc80d3b2318e118075e33697f164736f6c63430008110033 \ No newline at end of file